好的,我有两个表,一个类别表和一个帖子表。
我希望构造一个查询,它将返回每个类别,该类别的post表中的最后一条记录(类别)。id = post.category_id)和所有post的行数。Category_id = category.id)
即类别列表,每个类别都记录了该类别的最新帖子和该类别中的帖子数。
我尝试过各种连接和子选择,我已经设法获得类别列表,他们的帖子计数和他们的第一个帖子(我需要最后一个)。
我还设法获得了类别和它们的最后一篇文章的列表,但不是帖子数。
任何帮助/指示将非常感激!
试试这个:
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
你的描述缺乏一点数据(我已经做了假设),但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。
如果您需要最后一篇文章的内容,您需要将其连接回posts表