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


PHP/MYSQL: Get last record of table in a Join AND row count of the joined table

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

我希望构造一个查询,它将返回每个类别,该类别的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

如果你需要类别表中的一些东西,那么你只需要加入它。

假设:

  1. 有一个列称为postdate在你的帖子表,反映了一个帖子生成的日期(所以最大的一个是最近的)。如果没有日期,你也可以做max(id)。虽然只有在没有变化的情况下,过去的帖子才能更新,所以它实际上是最近的(例如id=2上周创建,今天更新,id=3昨天创建)。
  2. 有一个名为id的列-每个帖子行的唯一id。

如果您需要最后一篇文章的内容,您需要将其连接回posts表