Как мне присоединиться к последней записи в таблице?

StackOverflow https://stackoverflow.com/questions/881198

  •  22-08-2019
  •  | 
  •  

Вопрос

То, что мне нужно сделать, очень просто...но сейчас 3 часа ночи, и я, вероятно, упускаю из виду очевидное.

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

Единственная проблема заключается в том, что когда я присоединяюсь к таблице posts, она присоединяется к первой записи в таблице, а не к последней, которая обозначала бы последнее сообщение на этом форуме.

Вот упрощенный запрос, который получает список форумов + данные для "последнего" сообщения (которое теперь функционирует как "первое сообщение").

SELECT forum_title, forum_id, post_subject, post_user, post_id, post_date FROM board_forums 
     LEFT JOIN board_posts 
     ON (forum_id = post_parentforum AND post_parentpost = 0) 
WHERE forum_status = 1
GROUP BY forum_id
ORDER BY forum_position

Как я могу это исправить?

Это было полезно?

Решение

Проблема, с которой вы столкнулись, является классической Неоднозначная ГРУППА ПО проблема.Это особенно характерно для MySQL, потому что другие СУБД (и стандартный SQL) вообще не разрешат ваш запрос.Ваш запрос не соответствует правилу однозначности, поскольку вы перечислили не все неагрегированные столбцы в GROUP BY.

Вот решение, демонстрирующее мой любимый способ получения наибольшей строки для каждой группы:

SELECT f.forum_title, f.forum_id, p1.post_subject, p1.post_user, 
  p1.post_id, p1.post_date 
FROM board_forums f
LEFT JOIN board_posts p1
  ON (f.forum_id = p1.post_parentforum AND p1.post_parentpost = 0)
LEFT JOIN board_posts p2
  ON (f.forum_id = p2.post_parentforum AND p2.post_parentpost = 0 
      AND p1.post_id < p2.post_id)
WHERE p2.post_id IS NULL AND f.forum_status = 1
ORDER BY f.forum_position;

Если p2.post_id IS NULL, это означает , что сообщение не найдено в p2 что больше, чем сообщение, найденное в p1.

Следовательно, p1 является последним сообщением (при условии post_id автоматически увеличивается).


Повторный комментарий:

Небольшая проблема с этим.post_id с самым высоким идентификатором не обязательно является последней публикацией.

Никаких проблем.Просто используйте столбец, который гарантированно отличает более раннюю публикацию от более поздней.Вы упоминаете post_date.В случае связей вам придется разорвать связи с другим столбцом (или столбцами), которые обязательно будут располагаться в хронологическом порядке.

LEFT JOIN board_posts p2
  ON (f.forum_id = p2.post_parentforum AND p2.post_parentpost = 0 
    AND (p1.post_date < p2.post_date 
      OR p1.post_date = p2.post_date AND p1.post_millisecond < p2.post_millisecond))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top