【问题标题】:Get latest date in multiple join获取多个加入的最新日期
【发布时间】:2012-08-10 11:16:34
【问题描述】:

我正在努力解决这个问题,即使 Stack Overflow 上有一些类似的问题,我也找不到正确的解决方案。我有三个表:categories, topicsposts 我想加入它们并在categories 中显示每个类别以及来自topics 的最新主题的主题,其中发布了一些内容,最后是最新日期帖子是从posts 表中发布的。

我成功地让所有内容都按我想要的方式显示,只是我无法从每个类别中获取最新的帖子记录。

这是查询:

SELECT c.cat_id, c.cat_name, c.cat_description, t.topic_subject, t.topic_id, p.post_date FROM categories c 
LEFT JOIN topics t ON c.cat_id = t.topic_cat 
LEFT JOIN posts p ON p.post_topic = t.topic_id AND p.post_date = ( SELECT MAX(post_date) as post_date FROM posts WHERE post_topic = t.topic_id ) 
GROUP BY c.cat_id ORDER BY UNIX_TIMESTAMP(post_date) DESC

我意识到这应该与 WHERE 子句中的 topic_id 不是我正在寻找的那个有关。另一个这样的:

SELECT c.cat_id, c.cat_name, c.cat_description, t.topic_subject, t.topic_id, p.post_date FROM categories c 
LEFT JOIN topics t ON c.cat_id = t.topic_cat AND t.topic_id = ( SELECT post_topic FROM posts ORDER BY UNIX_TIMESTAMP(post_date) DESC LIMIT 1 ) 
LEFT JOIN posts p ON p.post_topic = t.topic_id AND p.post_date = ( SELECT MAX(post_date) as post_date FROM posts WHERE post_topic = t.topic_id ) 
GROUP BY c.cat_id ORDER BY UNIX_TIMESTAMP(post_date) DESC

显然只会显示包含最新帖子的类别的正确帖子。如何获取所有类别的最新帖子?

【问题讨论】:

  • 主题表是否有字段 post_date?
  • 不,只有帖子表。它们都通过它们的 ID 连接,例如 cat_id = topic_cat 和 topic_id = post_topic

标签: sql join group-by sql-order-by


【解决方案1】:
SELECT c.cat_id, c.cat_name, c.cat_description, tp.topic_subject, tp.topic_id, tp.maxPostDate
FROM categories c 

LEFT JOIN (select t.topic_cat,t.topic_subject,t.topic_id, max(post_date) maxPostDate  from topics t
           LEFT JOIN posts p ON p.post_topic = t.topic_id
           group by t.topic_cat,t.topic_subject,t.topic_id) tp
on (c.cat_id=tp.topic_cat)


where tp.maxPostDate = (select max(post_date) from topics t2
                       LEFT JOIN posts p2 ON p2.post_topic = t2.topic_id
                       where t2.topic_cat=c.cat_id
                       )


ORDER BY UNIX_TIMESTAMP(tp.maxPostDate) DESC

注意:如果一个类别有 2 个不同的主题且最大发布日期相同,则此查询可以输出例如 2 行。

【讨论】:

  • 太棒了!非常感谢......如果可以的话,我会给你 10 票;)
  • 但是要输出两个,它们需要在同一秒发布,对吧?不太可能...
  • 是的,他们需要在同一类别的不同主题中以相同的时间戳发布 2 个帖子。不太可能但并非不可能:)
  • 知道如何在同一查询中还 select 来自 userswhere userID = p.post_by 的用户名,以便在每个类别中发布最新帖子的用户也会出现?
  • 要获取用户名,将此子查询列添加到主选择:'(从用户中选择用户名,其中 userid=(从帖子 p3 中选择 post_by,其中 p3.post_topic=tp.topic_id 和 p3.post_date=tp .maxPostDate))'
【解决方案2】:

首先:在您的 Select 查询中,您必须对未包含在 GROUP BY 子句中的字段使用一些聚合函数。

现在。要获得每个类别的最大时间戳的帖子,您必须进行两步查询。在第一步中,您将获得类别的最大时间戳,然后在第二步中获得所有其他字段。是的,我们将使用 cat_id + timestamp 作为主键。它可以为相同的 cat_id 提供一些重复的记录,但在实时ocours 中会很奇怪。

代码将类似于:

SELECT c.cat_id, MAX( p.post_date ) as max_date
into #tmp_table
FROM categories c 
    LEFT JOIN topics t ON c.cat_id = t.topic_cat 
    LEFT JOIN posts p ON p.post_topic = t.topic_id 
GROUP BY c.cat_id 

SELECT * -- what you'll need
from #tmp_table as tmp
    LEFT JOIN categories as c on c.cat_id = tmp.cad_id
    LEFT JOIN topics t ON c.cat_id = t.topic_cat 
    LEFT JOIN posts p ON p.post_topic = t.topic_id AND p.post_date = tmp.max_date
-- order by -- what you'll need

这是一个解决方案, 更好的可能会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多