Mysql LEFT JOIN -> 获取最新的主题id/主题标题

Posted

技术标签:

【中文标题】Mysql LEFT JOIN -> 获取最新的主题id/主题标题【英文标题】:Mysql LEFT JOIN -> Get latest topic id / topic title 【发布时间】:2011-12-31 17:39:45 【问题描述】:

我正在尝试离开加入所有主题所在的表格。我想做的是列出所有论坛及其子类别,同时列出最新主题

SELECT root.name AS root_name
   , subcat.name AS subcat_name
   , subcat.id AS subcat_id
   , subcat.description AS subcat_description
   , subcat.safe_url AS subcat_safe_url
   , topics.*
FROM forum_category AS root
LEFT JOIN forum_category AS subcat ON subcat.parent_id = root.id 
LEFT JOIN
(
   SELECT MAX(`last_post_time`) AS aaaa, last_post_time, topic_title
      , topic_id, forum_id
   FROM `forum_topics`
   WHERE 1
   GROUP BY forum_id
) AS topics ON topics.forum_id = subcat.id 
WHERE root.parent_id = 0 
ORDER BY root_name, subcat_name 

但现在我有点卡住了:(,它是如此接近但目前它仅在每个子论坛中列出第一个主题,我需要最后一个但不知道如何。

【问题讨论】:

哎呀,逗号起跑线伤了我的眼睛TT 呵呵我从来没有真正想过它,我觉得它看起来不错:) 【参考方案1】:

您的子查询查找最后一篇文章的问题是没有理由让 last_post_time、topic_title 等属于具有 MAX(last_post_time) 的行。

想想这个查询:

SELECT MAX(last_post_time), MIN(last_post_time), topic_title
FROM forum_topics
GROUP BY forum_id

这会返回哪个 topic_title?发帖时间最长的那一排?发布时间最少的那一排?模棱两可——mysql只能从组中任意选择一个topic_title。在实践中,它会从首先物理存储在组中的行中进行选择,这超出了您的控制范围,取决于存储引擎实现等。

这是另一种设计,它找到没有其他 forum_topics 行存在且 last_post_time 更大的 forum_topics 行:

SELECT root.name AS root_name
   , subcat.name AS subcat_name
   , subcat.id AS subcat_id
   , subcat.description AS subcat_description
   , subcat.safe_url AS subcat_safe_url
   , topics.*
FROM forum_category AS root
LEFT JOIN forum_category AS subcat ON subcat.parent_id = root.id 
LEFT JOIN forum_topics AS topics ON topics.forum_id = subcat.id
LEFT JOIN forum_topics AS t2 ON t2.forum_id = subcat.id 
  AND t2.last_post_time > topics.last_post_time
WHERE root.parent_id = 0 AND t2.forum_id IS NULL
ORDER BY root_name, subcat_name 

【讨论】:

嘿,比尔,谢谢您的出色回答!我想我现在终于明白了……整天都在为这个苦苦挣扎。我从来没有真正想过要像你那样做,但这是有道理的。

以上是关于Mysql LEFT JOIN -> 获取最新的主题id/主题标题的主要内容,如果未能解决你的问题,请参考以下文章

MySql如何将LEFT JOIN查询与NOT IN查询结合起来

带有 LEFT JOIN 和 GROUP BY 的 COUNT(*) 在 MySQL 中包含 NULL

MySQL LEFT JOIN 在第二个表中具有可选值

MySql 之 left join 查询结果

嵌套 CONCAT 中的 LEFT JOIN 和 IS NULL 仅返回 NULL

关于mysql中的left join和left outer join的区别