【问题标题】:PHP/MYSQL: Get last record of table in a Join AND row count of the joined tablePHP / MYSQL:获取联接表的联接和行数中的最后一条记录
【发布时间】:2011-12-17 10:44:44
【问题描述】:

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

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

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

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

我还设法获得了一个类别列表及其最后的帖子,但不是帖子数。

任何帮助/指导将不胜感激!

【问题讨论】:

    标签: php mysql join count


    【解决方案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
    

    【讨论】:

    • 感谢您的回答马克,它工作得很好——只是有点抱怨。这只会返回至少有一个帖子的类别,是否可以将其更改为也返回没有帖子的类别?干杯!
    • 太棒了!对我的需求进行了快速调整,它运行良好 - 非常感谢!
    • 对于其他感兴趣的人 - 我将第 5 行的 'category.id' 更改为 'category.id AS category_id',它现在可以完美运行
    • @user1018742:感谢您指出错误。我已经更新了我的答案以更正它。
    【解决方案2】:

    您的描述缺少一点数据(我做了假设),但 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。

    如果您需要最后一篇文章的内容,您需要将其加入到帖子表中。

    【讨论】:

    • 感谢您的回复鲁杜。我确实想使用帖子表中的 id 字段来搜索最后一篇帖子。我认为您发布的查询只会返回有帖子的类别(我想返回 all 类别,无论帖子数量如何。此外,当我尝试加入帖子数据并按category_id,返回的是 first 帖子记录,而不是最后一个。我只能通过使用子选择来抓取最后一个(或者看起来如此!)干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2019-12-28
    • 1970-01-01
    相关资源
    最近更新 更多