[英]How do I join to the latest record in the table?
我需要做的事情很簡單......但凌晨3點和我可能會忽略顯而易見的事情。
我編碼一個簡單的論壇。 一個表存儲論壇標題,描述等,而另一個表存儲帖子。 在論壇列表中,顯示所有論壇的列表,我想在每個論壇中獲取最新帖子,並顯示帖子主題,海報和帖子ID以及日期。 簡單。
唯一的問題是,當我加入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
我怎樣才能解決這個問題?
你遇到的問題是經典的Ambiguous 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
找到的帖子更大的帖子。
因此, p1
是最新的帖子(假設post_id
是自動遞增的)。
評論:
這個問題很輕微。 具有最高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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.