Система личных сообщений, как на Веблансере
73 сообщения
#14 лет назад
Привет всем, делаю социалку нужно сделать личные сообщения, сделал как везде просто папка входящие и исходящие, затем решил сделать как здесь, заходишь в сообщения а там контакты с кем ты в диалоге, в общем как аська, список чтоб выводился то я сделал, но при переходе к конкретному диалогу получается выводить только входящие от него сообщения а исходящие от меня к нему нет, подскажите пожалуйста как можно объединить входящие и исходящие сообщения, вот моя таблица личных сообщенийCREATE TABLE IF NOT EXISTS `private_message` (
`idmess` int(11) NOT NULL AUTO_INCREMENT,
`message` text,
`from` int(15) NOT NULL,
`to` int(15) NOT NULL,
`from_read` enum('0','1'

`to_read` enum('0','1'

`from_del` enum('0','1'

`to_del` enum('0','1'

`from_read_time` varchar(30) DEFAULT NULL,
`to_read_time` varchar(30) DEFAULT NULL,
`from_del_time` varchar(30) DEFAULT NULL,
`to_del_time` varchar(30) DEFAULT NULL,
`create_time` varchar(30) DEFAULT NULL,
PRIMARY KEY (`idmess`),
UNIQUE KEY `idmess_UNIQUE` (`idmess`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;
601 сообщение
#14 лет назад
Эм... WHERE ((`from_read` = айди 1 человека) AND (`to_read` = айди 2 человека )) OR ((`to_read`= айди 2 человека ) AND (`from_read` = айди 1 человека))И отсортировать ORDER BY `create_time`
В чем проблема то?=)
5330 сообщений
#14 лет назад
Надо еще только индексы сделать по всем столбцам в запросе + время
73 сообщения
#14 лет назад
Спасибо большое, но еще проблема я делаю запрос к двум таблицам, фотографиям юзеров и их инфо, когда выводятся поля выводятся дубли, как с этим бороться?? а если вывожу только сообщения все как нужно.вот запрос
SELECT pm.*, u.* FROM $tablepm pm, $tableusers u WHERE ((pm.m_to_name='$sess_user'




73 сообщения
#14 лет назад
SELECT pm.*, u.* FROM $tablepm pm, $tableusers u WHERE ((pm.m_to_name='$sess_user'



вот..
а список собеседников вывожу
SELECT pm.*, uf.m_img, u.* FROM $tablepm pm, $tableusfoto uf, $tableusers u
WHERE pm.m_to_name='$sess_user' AND pm.m_from_name = uf.m_username AND pm.m_from_name = u.m_username ORDER BY m_idmess DESC
так, и в цикле удаляю дубликаты собеседников, если такой уже вывелся,
так
$existname = array();
while ($row_pm = mysql_fetch_assoc($pm_inbox_query)) {
if (!in_array($row_pm,$existname)) {
вывожу собеседника и ссылку на папку с перепиской с данным собеседником
}
$existname = $row_pm;
$i++;
}
73 сообщения
#14 лет назад
Если кто знает, как через запрос к базе вывести поля без повторений, например, полясообщение 1| имя отправителя 1 | имя получателя 1
сообщение 2| имя отправителя 1 | имя получателя 1
сообщение 1| имя отправителя 2 | имя получателя 1
сообщение 3| имя отправителя 1 | имя получателя 1
сообщение 2| имя отправителя 2 | имя получателя 1
вывести имя отправителя 1 и имя отправителя 2 по одному разу
подскажите, пожалуйста, если кто нибудь знает.
73 сообщения
#14 лет назад
Хотя нет не помогло((((((((((((((((((((((( она начинает с первых сообщений и группирует первые попавшиеся, а мне нужно чтоб и последнее сообщение показывалось, тот вариант подходит больше, но при 10000 тысяч сообщений запрос уже 2,5 секунд обрабатывается(((
601 сообщение
#14 лет назад
Попонятнее, если можно обьясните, что конкретно хотите.Цитата:
сообщение 1| имя отправителя 1 | имя получателя 1
сообщение 2| имя отправителя 1 | имя получателя 1
сообщение 1| имя отправителя 2 | имя получателя 1
сообщение 3| имя отправителя 1 | имя получателя 1
сообщение 2| имя отправителя 2 | имя получателя 1
вывести имя отправителя 1 и имя отправителя 2 по одному разу
Цитата ("speedi"):
а мне нужно чтоб и последнее сообщение показывалось
Вам нужно чтобы оно показывало сообщение? Или только имена отправителей(по 1 разу)?
5330 сообщений
73 сообщения
#14 лет назад
Короче так, захожу я в сообщения а там, люди с кем я уже в контакте, и если есть от него новое сообщение показывает +1 и кусочек сообщения, или если даже нету новых сообщений просто показывает последнее сообщение, от меня или от него..| |
|фото| Пользователь 1
| |
Сообщения(+1)
________________________________________________
| |
|фото| Пользователь 1
| |
Кусок сообщения
________________________________________________
| |
|фото| Пользователь 1
| |
Я:кусок сообщения
________________________________________________
Как в мобильной версии одноклассников.
Я уже сделал, доработал свой метод, только оповещание о новом сообщение пока не сделал.
Вот код:
$pm_count_inbox = mysql_fetch_array(my_q("SELECT COUNT(*) FROM $tablepm WHERE m_to_name='$sess_user'"

$pm_count = $pm_count_inbox;
###получаю количество всех сообщений адресованных мне
$pm_count = $pm_count - 200;
###отрезаю от количества 200, это будет лимитом в дальнейшем откуда будет браться список собеседников
$pm_twoquery_inbox = mysql_fetch_array(my_q("SELECT m_idmess FROM $tablepm WHERE m_to_name='$sess_user' LIMIT $pm_count,1"

###теперь получаю ид сообщения с которого начну главный запрос
$startidmsg = $pm_twoquery_inbox;
$pm_inbox_query = my_q("SELECT pm.*, uf.m_img, u.* FROM $tablepm pm, $tableusfoto uf, $tableusers u
WHERE pm.m_to_name='$sess_user' AND pm.m_from_name = uf.m_username AND pm.m_from_name = u.m_username AND pm.m_idmess > '$startidmsg' ORDER BY m_idmess DESC LIMIT 200"

### этот запрос обрабатываю в цикле, код который выкладывал выше,
В итоге сколько бы сообщений в базе не было запрос будет выполняться с одинаковой нагрузкой.
Еще пару условий прописать и будет ништяк))
73 сообщения
#14 лет назад
А вообще у меня еще такая идея, создать отдельную таблицу для контактов,если пишу человеку первый раз добавляю поле в таблицу dialogs поля
id_dlg | who | withwho |last_msg_id
----------------------------
1 | usr1 | usr 2 |
записываю отправителя, получателя и ид последнего сообщения.
Если диалог уже существует, обновляю записи.
3240 сообщений
#14 лет назад
Цитата ("speedi"):CREATE TABLE IF NOT EXISTS `private_message` (
`idmess` int(11) NOT NULL AUTO_INCREMENT,
`message` text,
`from` int(15) NOT NULL,
`to` int(15) NOT NULL,
int(15) ???
Цитата ("speedi"):
PRIMARY KEY (`idmess`),
UNIQUE KEY `idmess_UNIQUE` (`idmess`)
Зачем нужен UNIQUE KEY на то же поле, что используется и в PRIMARY KEY?
Цитата ("speedi"):
`idmess` int(11) NOT NULL AUTO_INCREMENT,
Почему тут int(11)? Неужели допускаете, что могут быть и отрицательные значения idmess?
Почему бы там не использовать INT UNSIGNED?