好的,我有两个表,一个类别表和一个职位表。
我希望构造一个查询,该查询将返回每个类别,该类别的帖子表中的最后一条记录(category.id = post.category_id)以及所有具有post.category_id = category.id的帖子的行数
即
类别列表,每个类别都有该类别的最新帖子记录以及该类别中的帖子数。
我尝试了各种联接和子选择,并且设法获得了类别列表,其帖子数和其第一帖子(我需要最后一个)。
我还设法获得了类别及其最后发布的列表,但没有发布计数。
任何帮助/方向将不胜感激!
您的描述缺少一些数据(我已经做过假设),但是SQL应该是:
SELECT category_id,max(postdate) last,count(id) postcount
FROM posts
GROUP BY category_id
如果您需要分类表中的某些内容,则只需加入即可。
假设:
您的帖子表中有一列称为postdate的列,该列反映了帖子的生成日期(因此,最大的是最新的)。如果没有日期,您也可以执行max(id) ...尽管只有在没有更改的情况下才能更新过去的帖子,所以它实际上是最近的帖子(例如,id = 2上周创建,今天更新,id = 3昨天创建) )。
有一个名为id的列-每个帖子行的唯一ID。
如果您需要最后一篇文章的内容,则需要将其重新添加到帖子表中。
感谢您的答复Rudu。 我确实想使用帖子表中的id字段来搜索最后一个帖子。 我认为您发布的查询将仅返回具有帖子的类别(无论帖子数如何,我都希望返回所有类别。此外,当我尝试加入帖子数据并按category_id分组时,第一个帖子记录是 返回,而不是最后一个。我只能通过使用subselect来抓住最后一个(或者看起来如此!)
尝试这个:
SELECT category_id, MAX(post_id) AS post_id, COUNT(*) AS posts
FROM post
GROUP BY category_id
假定您具有严格增加且唯一的列post_id。
如果没有这样的字段,但是例如post_date不是唯一的,则在极少数情况下,如果两个帖子具有完全相同的时间戳,则可能会为某些类别获得两行。
要获取没有帖子的类别,请使用LEFT JOIN:
SELECT
category.id AS category_id,
MAX(post.id) AS post_id,
COUNT(post.category_id) AS posts
FROM category
LEFT JOIN post
ON category.id = post.category_id
GROUP BY category.id
如果需要每个表中的更多列,则可以将上面的结果与原始表连接:
SELECT *
FROM
(
SELECT
category.id AS category_id,
MAX(post.id) AS post_id,
COUNT(post.category_id) AS posts
FROM category
LEFT JOIN post
ON category.id = post.category_id
GROUP BY category.id
) T1
JOIN category
ON T1.category_id = category.id
LEFT JOIN post
ON T1.post_id = post.id
谢谢您的回答。Mark,它的功能很棒-只需一小步。 这只会返回至少有一个帖子的类别,是否可以更改为也返回没有帖子的类别? 干杯!
辉煌! 快速调整一下即可满足我的需求,并且效果很好-非常感谢!
对于其他感兴趣的人-我将第5行的category.id更改为category.id AS category_id,它现在可以正常使用