我需要做的是简单...但它的上午03点和Im大概俯瞰明显。

林编码一个简单的论坛。一个表存储论坛标题,描述等,而其他商店的职位。在论坛列表中,显示所有论坛的名单,我要抢在每个论坛最新帖子,并显示文章标题,海报和帖子ID,和日期。简单。

唯一的问题是,当我加盟的职位表,它加入到表中的第一条记录,而不是最后,这表示在该论坛上一个帖子。

下面是获取论坛+数据的列表为“最新”职位的简化查询(现在用作“第一交”)。

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

我怎样才能解决这个问题?

有帮助吗?

解决方案

你打的问题是经典的暧昧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是自动递增)。


重新评论:

  

轻微问题与此有关。 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))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top