PHP / MYSQL:获取连接表的Join AND行计数中表的最后一条记录

时间:2011-10-28 16:42:30

标签: php mysql join count

好的,我有两个表,一个类别表和一个帖子表。

我希望构建一个返回每个类别的查询,该类别的post表中的最后一条记录(category.id = post.category_id)以及post.category_id = category.id的所有帖子的rowcount)

类别列表,每个类别都包含该类别最新帖子的记录以及该类别中的帖子数量。

我尝试了各种连接和子选择,并且我设法获得了一个类别列表,他们的帖子数量和他们的第一篇文章(我需要最后一个)。

我还设法获得了一个类别及其最后一篇文章的列表,但没有获得帖子计数。

非常感谢任何帮助/指示!

2 个答案:

答案 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

如果你需要类别表中的某些内容,那么你只需加入它。

假设:

  1. 您的帖子表中有一个名为postdate的列,它反映了帖子的生成日期(因此最大的一个是最新的)。如果没有日期,你也可以max(id) ...虽然只有没有变化,过去的帖子才能更新,所以它实际上是更新的(例如上周创建的id = 2,今天更新,id = 3昨天创建。
  2. 有一个名为id的列 - 每个帖子行的唯一ID。
  3. 如果您需要上一篇文章的内容,则需要将其加入帖子表。