Sql 获取多重加入中的最新日期

Sql 获取多重加入中的最新日期,sql,join,group-by,sql-order-by,Sql,Join,Group By,Sql Order By,我正在努力解决这个问题,尽管在堆栈溢出方面有一些类似的问题,但我找不到正确的解决方案。我有三个表:类别、主题和帖子,我想在其中加入它们,并在类别中显示每个类别,以及在其中发布内容的主题中最新主题的主题,最后是从帖子表中发布帖子的最新日期 我成功地将所有内容按我想要的方式显示出来,只是我无法从每个类别中获取最新的帖子记录 问题是: SELECT c.cat_id, c.cat_name, c.cat_description, t.topic_subject, t.topic_id, p.post_

我正在努力解决这个问题,尽管在堆栈溢出方面有一些类似的问题,但我找不到正确的解决方案。我有三个表:类别、主题和帖子,我想在其中加入它们,并在类别中显示每个类别,以及在其中发布内容的主题中最新主题的主题,最后是从帖子表中发布帖子的最新日期

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

问题是:

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

很明显,它只会显示类别的正确帖子,其中包含最新的帖子。如何获取所有类别的最新帖子?

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

现在。要获取每个类别具有最大时间戳的帖子,您必须进行两步查询。在第一步中,您将获得类别的最大时间戳,在第二步中,您将获得所有其他字段的最大时间戳。是的,我们将使用cat_id+时间戳作为主键。它可以为同一个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
这是一个解决方案,
更好的可能更好。

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

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
现在。要获取每个类别具有最大时间戳的帖子,您必须进行两步查询。在第一步中,您将获得类别的最大时间戳,在第二步中,您将获得所有其他字段的最大时间戳。是的,我们将使用cat_id+时间戳作为主键。它可以为同一个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
这是一个解决方案, 更好的可能会更好

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行

“主题”表是否有“发布日期”字段?不,仅“发布”表。它们都是通过各自的id连接起来的,比如cat\u id=topic\u cat和topic\u id=post\u topic主题表是否有post\u date字段?不,只有posts表。它们都是通过id连接的,比如cat\u id=topic\u cat和topic\u id=post\u topic!非常感谢……如果可以的话,我会给你10票;但是为了输出两个,它们必须在同一秒发布,对吗?不太可能…是的,他们需要用相同的时间戳在同一类别的不同主题中发布2篇文章。不太可能,但并非不可能:知道如何在同一查询中也从userID=p.post_by的users表中选择用户名,以便在每个类别中发布最新帖子的用户也会出现吗?要获取用户名,请将此子查询列添加到主select:“select username from users where userID=select post_by from posts p3 wherep3.post\u topic=tp.topic\u id和p3.post\u date=tp.maxPostDate'Brilliant!非常感谢……如果可以的话,我会给你10票;但是为了输出两个,它们必须在同一秒发布,对吗?不太可能…是的,他们需要用相同的时间戳在同一类别的不同主题中发布2篇文章。不太可能,但并非不可能:知道如何在同一查询中也从userID=p.post_by的users表中选择用户名,以便在每个类别中发布最新帖子的用户也会出现吗?要获取用户名,请将此子查询列添加到主select:“select username from users where userID=select post_by from posts p3 wherep3.post\u topic=tp.topic\u id和p3.post\u date=tp.maxPostDate'