【问题标题】:how to order data in mysql by join count?如何通过连接计数对mysql中的数据进行排序?
【发布时间】:2014-03-05 10:36:51
【问题描述】:

我有两张桌子:

posts : id,title,content,show,created_at

comments: id,post_id,created_at

我正在尝试按评论最多的帖子排序。

SELECT *, COUNT(comments.id) AS total_comments
FROM comments LEFT JOIN posts ON posts.id = comments.post_id
WHERE posts.show = '1'
GROUP BY complains.id
ORDER BY total_comments DESC

问题是没有出现 0 cmets 的帖子。 任何帮助将不胜感激。

【问题讨论】:

  • 你在问什么?如何对count 进行排序,或者为什么没有出现 0 cmets 的帖子?
  • 您需要LEFT JOIN cmets 发帖,而不是发帖给 cmets。这样,将显示零 cmets 的帖子。
  • 什么是抱怨?那应该读 cmets 吗?
  • 你……不能数不存在的东西。

标签: php mysql sql sorting join


【解决方案1】:

通过上述加入,您错误地加入以获得有帖子的评论 您应该进行右连接或交换左连接中的表,如下所示。

Select *, COUNT(comments.id) as total_comments
FROM posts
LEFT outer JOIN comments on  posts.id = comments.post_id
WHERE posts.show = '1'
GROUP BY posts.id
ORDER BY total_comments DESC

【讨论】:

    【解决方案2】:

    您需要执行右连接而不是左连接。或者交换 LEFT JOIN 子句中的表。

    【讨论】:

    • +1 用于解释问题而不是为他写出解决方案。可悲的是,Nihat 只是为他做作业,没有任何解释。
    • 从我的个人资料中可以看出,我是新手。下次我会做得更好。谢谢你的评论。
    • @Nihat 做人的方式。我现在感觉自己像个混蛋!我们都在这里只是为了最终帮助人们。对于我的粗鲁评论,我深表歉意。
    • 嘿,你给我上了一课。你也是对的。如果没有解释,他就不会学到任何东西。
    【解决方案3】:

    虽然有很多方法可以解决这个问题,但我认为这段代码很容易阅读和理解。

    LEFT JOIN 中的查询可以复制出来并自行运行以帮助调试。然后将该结果集加入到帖子表中并对结果进行排序。

    SELECT p.*, IFNULL(c.total_comments, 0) as total_comments
    FROM posts p
    LEFT JOIN (select post_id, count(post_id) as total_comments from comments group by post_id) as c ON p.id = c.post_id
    WHERE p.show = '1'
    ORDER BY c.total_comments DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-22
      • 2013-10-28
      • 2017-11-09
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多