MySQL запросы в порядке -> предел, сортировка, группировка.Как? - PullRequest
0 голосов
/ 27 ноября 2011

о, это сводит меня с ума.У меня есть таблица сообщений, упрощенный пример:

id[int] - sender[int] - receiver[int] - conv_id[bigint] - received[int] - stamp[int]
   1          2             1               5                  1          timestamp+1 
   2          2             1               5                  1          timestamp+2
   3          3             1               6                  1          timestamp+3 
   4          4             1               7                  1          timestamp+4
   5          5             1               8                  1          timestamp+5 
   6          5             1               8                  1          timestamp+6

Теперь мне интересны результаты, сгруппированные по получателям, ограничены 3 отправителями и отсортированы по штампу DESC.Как это сделать?

У меня уже есть это, но оно принимает все сообщения, и я считаю, что это не лучший способ не потерять производительность, хотя я действительно не гуру mysql:

SELECT id, sender, receiver, conv_id FROM
   (SELECT m.id, m.sender, m.receiver,m.conv_id 
    FROM messages AS m WHERE m.receiver = 1 AND m.received = 1 
    ORDER BY m.stamp DESC) as messages_tmp 
WHERE receiver = 1 GROUP BY conv_id ORDER BY NULL LIMIT 0,3

Это должно вернуть эти результаты в следующем порядке:

id = 6, id = 4, id = 3

Дело в том, что я уже делаю с запросами этого, для m.received = 0, а затем, если результатов недостаточно, дляm.received = 1.Пока моя база данных не слишком большая, но если она станет больше, я боюсь, что это может быть медленным.Я думаю о возможности ограничить результаты подзапроса, но не знаю, как это сделать, и буду уверен, что после GROUP получу достаточно результатов.Спасибо.

1 Ответ

1 голос
/ 27 ноября 2011
SELECT id, sender, receiver,conv_id 
FROM messages WHERE receiver = 1 AND received = 1 
GROUP BY conv_id
ORDER BY id DESC LIMIT 3
...