SQL Group By с лимитом и отчетливостью - MySQL - PullRequest
0 голосов
/ 17 мая 2011

Это мои таблицы и структура

Чат

  • SID // PK
  • Заголовок // Заголовок

shoutbox_follower

  • SID
  • UID // Идентификатор пользователя

Крики

  • SID
  • Текст // Крики

Я хочу получить последние 1 (последние) крики (Shouts.Text) для каждого Shoutbox, за которым следит пользователь


Я попробовал это, но это не сработало

select shoutbox_follower.SID,shoutbox.title, shouts.text from shoutbox_follower, shoutbox, shouts where shoutbox_follower.uid=1;

Но я могу сделать работу с несколькими запросами

SELECT SID from shoutBox_Follower where UID=5
SELECT SID,TEXT from Shouts where SID in ($boxList) order by id desc limit 1
SELECT Title from Shoutbox where SID=? limit 1

Ответы [ 2 ]

4 голосов
/ 17 мая 2011

Вы можете комбинировать запросы, в таких случаях:

SELECT SID,
       (select TEXT
       from Shouts
       where Shouts.SID = shoutBox_Follower.SID
       order by Shouts.SID desc limit 1
       ) as shout_text
from shoutBox_Follower
where UID=5

Он работает очень быстро для небольшого числа строк (конечно, при условии, что у вас есть необходимые индексы). На основании вашего третьего запроса заголовок может быть получен с помощью простого внутреннего соединения.

1 голос
/ 17 мая 2011

В комментариях вы упомянули, что вам нужно быстрое решение.Если это так, то добавьте поле latest_shout_id в таблицу shoutbox и сохраните его с помощью триггера AFTER INSERT таблицы shouts.Это все.

Вот запрос, который будет делать то, что вы хотите (при условии, что у вас есть shout_id в качестве PK в таблице shouts и ссылка на shoutbox в поле shoutbox_id):

    SELECT x.*
      FROM shoutbox_follower f
INNER JOIN (SELECT MAX(shout_id) shout_id,
                   shoutbox_id
              FROM Shouts s
          GROUP BY shoutbox_id) x ON x.shoutbox_id = f.sid 
     WHERE f.uid = 5

Изменение коррелированного подзапроса может изменить его быстрее или медленнее, это зависит от множества факторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...