SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 16.06.2014 11:45:13

kerrygun
Участник
Зарегистрирован: 28.05.2014
Сообщений: 4

Выборка списка сообщений

Делаю систему личных сообщений с такой вот структурой:
id, from, to, created, viewed, text, hash
from и to - это id пользователей, от кого и кому сообщение
created - дата создания.
viewed - дата прочтения сообщения получателем, по умолчанию null
text - само сообщение
hash - md5(CONCAT_WS('_', from, to)) - причем from и to не обязательно в таком порядке, они идут по возрастанию id, я это сделал, чтобы можно было проще выбирать цепочку сообщений между двумя юзерами.

Собственно, застрял я на том, что хочу человеку показывать список из его переписок: одна строчка - один диалог с одним из пользователей, сортированные по дате последнего сообщения, плюс общее количество сообщений/непрочитанных сообщений и все это одним запросом. Собственными силами такое соорудить не получается, помогите, а?

Неактивен

 

#2 16.06.2014 12:18:54

kerrygun
Участник
Зарегистрирован: 28.05.2014
Сообщений: 4

Re: Выборка списка сообщений

Решил часть проблемы - выборка без счетчиков сообщений (1 - это id пользователя, который смотрит список):

SELECT m2.*
FROM message as m1
JOIN (SELECT * FROM message WHERE `from` = 1 OR `to` = 1 ORDER BY created desc) as m2 ON m1.`hash` = m2.`hash`
WHERE m1.`from` = 1 OR m1.`to` = 1
GROUP BY m1.`hash`
ORDER BY m2.created desc

Насколько это оптимально?
Из вложенного в джоин селекта можно убрать условие WHERE, но, я думаю, что с ним работать будет быстрее, я прав?

Неактивен

 

#3 19.06.2014 04:27:58

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Выборка списка сообщений

Не следует стремиться сделать одним запросом. Для count можно сделать другой запрос, в большинстве случаев два запроса будут работать быстрее, чем один, так как каждый сможет оптимальнее оптимизироваться. Попробуйте избавиться от подзапроса. Если hash проиндексировано, то JOIN будет быстрым и WHERE внутри не требуется.

SELECT m2.*
FROM message as m1
JOIN message as m2 ON m1.`hash` = m2.`hash`
WHERE m1.`from` = 1 OR m1.`to` = 1
GROUP BY m1.`hash`
ORDER BY m2.created desc

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson