MySQL - Получение максимального ID из GROUP BY и поддержание производительности - PullRequest
1 голос
/ 21 июня 2020

У меня есть 3 таблицы:

Сообщение, Тема и Подфорум.

Подфорум имеет много Тем, а Тема имеет много Сообщений.

Я пытаюсь для получения последнего (на данный момент максимального ID) сообщения в каждом подфоруме.

Это то, что я пробовал до сих пор:

SELECT 
    p1.id,
    p1.thread_id,
    Subforums.id as subforum_id
FROM Posts p1 LEFT JOIN Posts p2
    ON (p1.thread_id = p2.thread_id AND p1.id < p2.id)
LEFT JOIN Threads
    ON p1.thread_id = Threads.id 
    AND p2.thread_id = Threads.id
LEFT JOIN Subforums 
    ON Threads.subforum_id = Subforums.id
WHERE p2.id IS NULL

И это дает мне такую ​​таблицу:

id | thread_id | subforum_id
12 | 1         | 4
...

Я понимаю, что могу использовать комбинацию операторов MAX и GROUP BY, чтобы получить максимальное id на subforum_id, но похоже, что это вообще неэффективно.

Есть ли лучший способ решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Ваш код выглядит так, как будто он выполняет полное сканирование таблицы сообщений, и, следовательно, да, неэффективно. Решение Фелипе Завана выглядит лучше, но не дает желаемых результатов. Предполагая, что id является первичным ключом в сообщениях, он будет проиндексирован, и я бы сделал

SELECT 
p1.id,
p1.thread_id,
Subforums.id as subforum_id
FROM (select thread_id, max(id) as id from Posts group by thread_id) as p1
LEFT JOIN Threads
    ON p1.thread_id = Threads.id 
LEFT JOIN Subforums 
    ON Threads.subforum_id = Subforums.id
0 голосов
/ 21 июня 2020

Вы можете попробовать подзапрос, который упорядочивает по Post.id DESC и LIMIT до 1 результата:

SELECT 
  s.id as subforum_id, 
  (
    SELECT 
      p.id 
    FROM 
      Posts p 
      LEFT JOIN Threads t ON p.thread_id = t.id 
    WHERE 
      s.id = t.subforum_id 
    ORDER BY 
      p.id DESC 
    LIMIT 
      1
  ) AS latest_post_id 
FROM 
  Subforums s;

Живой пример

...