Руслан И.
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' DEFAULT NULL,
`to_read` enum('0','1' DEFAULT NULL,
`from_del` enum('0','1' DEFAULT NULL,
`to_del` enum('0','1' DEFAULT NULL,
`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 лет назад
Надо еще только индексы сделать по всем столбцам в запросе + время
Алексей Б.
897 сообщений
#14 лет назад
Есть же примари idmess, по нему и сортировать.
Николай Г.
601 сообщение
#14 лет назад
Действительно, сортировать даже лучше по idmess.
Руслан И.
73 сообщения
#14 лет назад
Спасибо большое, но еще проблема я делаю запрос к двум таблицам, фотографиям юзеров и их инфо, когда выводятся поля выводятся дубли, как с этим бороться?? а если вывожу только сообщения все как нужно.
вот запрос
SELECT pm.*, u.* FROM $tablepm pm, $tableusers u WHERE ((pm.m_to_name='$sess_user' AND (pm.m_from_name ='$withuser') OR ((pm.m_to_name='$withuser' AND (pm.m_from_name ='$sess_user') AND pm.m_from_name = u.m_username ORDER BY m_idmess
Руслан И.
73 сообщения
#14 лет назад
Все уже сам разобрался))) все огромное спасибо
Евгений Б.
5330 сообщений
#14 лет назад
EXPLAIN покажите потом по факту
Руслан И.
73 сообщения
#14 лет назад
SELECT pm.*, u.* FROM $tablepm pm, $tableusers u WHERE ((pm.m_to_name='$sess_user' AND (pm.m_from_name ='$withuser' AND (pm.m_from_name =u.m_username)) OR ((pm.m_to_name='$withuser' AND (pm.m_from_name ='$sess_user' AND (pm.m_from_name =u.m_username)) ORDER BY m_idmess
вот..
а список собеседников вывожу
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 по одному разу

подскажите, пожалуйста, если кто нибудь знает.
Евгений Б.
5330 сообщений
#14 лет назад
Destinct или group by смотря как и что Вы хотите
Руслан И.
73 сообщения
#14 лет назад
Спасибо) group by помогло
Руслан И.
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 сообщений
#14 лет назад
Цитата ("speedi"):
а мне нужно чтоб и последнее сообщение показывалось, тот вариант подходит больше, но при 10000 тысяч сообщений запрос уже 2,5 секунд обрабатывается(((

explane покажите

не используйте group by
читаем здесь (первое, что нагуглилось)
Руслан И.
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?
Руслан И.
73 сообщения
#14 лет назад
Не знаю)) плохо разбираюсь в типах, int 15 просто не жадный)
Вадим Т.
3240 сообщений
#14 лет назад
Цитата ("speedi"):
Не знаю)) плохо разбираюсь в типах, int 15 просто не жадный)

Ну вот, значит сейчас есть повод разобраться в типах.
В двух словах, int(15) не имеет смысла, так как максимальное положительное значение INT включает в себя лишь 10 цифр.