Проблема, с которой вы столкнулись, - это классическая Неоднозначная проблема GROUP BY . Это относится к MySQL, потому что другие RDBMS (и стандартный 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
.
Ergo, p1
- последнее сообщение (при условии, что post_id
- автоинкремент).
Комментарий:
Небольшая проблема с этим. post_id с самым высоким 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))