簡體   English   中英

我如何加入表中的最新記錄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM