Задавайте вопросы, мы ответим
Вы не зашли.
Делаю систему личных сообщений с такой вот структурой:
id, from, to, created, viewed, text, hash
from и to - это id пользователей, от кого и кому сообщение
created - дата создания.
viewed - дата прочтения сообщения получателем, по умолчанию null
text - само сообщение
hash - md5(CONCAT_WS('_', from, to)) - причем from и to не обязательно в таком порядке, они идут по возрастанию id, я это сделал, чтобы можно было проще выбирать цепочку сообщений между двумя юзерами.
Собственно, застрял я на том, что хочу человеку показывать список из его переписок: одна строчка - один диалог с одним из пользователей, сортированные по дате последнего сообщения, плюс общее количество сообщений/непрочитанных сообщений и все это одним запросом. Собственными силами такое соорудить не получается, помогите, а?
Неактивен
Решил часть проблемы - выборка без счетчиков сообщений (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, но, я думаю, что с ним работать будет быстрее, я прав?
Неактивен
Не следует стремиться сделать одним запросом. Для count можно сделать другой запрос, в большинстве случаев два запроса будут работать быстрее, чем один, так как каждый сможет оптимальнее оптимизироваться. Попробуйте избавиться от подзапроса. Если hash проиндексировано, то JOIN будет быстрым и WHERE внутри не требуется.
Неактивен