好的,我有两个表,一个类别表和一个帖子表。
我希望构建一个返回每个类别的查询,该类别的post表中的最后一条记录(category.id = post.category_id)以及post.category_id = category.id的所有帖子的rowcount)
即
类别列表,每个类别都包含该类别最新帖子的记录以及该类别中的帖子数量。
我尝试了各种连接和子选择,并且我设法获得了一个类别列表,他们的帖子数量和他们的第一篇文章(我需要最后一个)。
我还设法获得了一个类别及其最后一篇文章的列表,但没有获得帖子计数。
非常感谢任何帮助/指示!
答案 0 :(得分:1)
试试这个:
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
答案 1 :(得分:1)
您的描述缺少一些数据(我做了假设),但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。如果您需要上一篇文章的内容,则需要将其加入帖子表。