【问题标题】:SQL - How To Order Using Count From Another TableSQL - 如何使用另一个表中的计数进行排序
【发布时间】:2011-06-14 15:33:07
【问题描述】:

1.博主

blogger_id
1 
2
3

2。帖子

post_from_blogger_id
1 
1
1
2
2
3

如您所见,博主 №1 发布的内容比其他博主多,博主 №3 的发帖量少。问题是 如何构建一个查询来选择所有博主并按帖子数量对其进行排序?

【问题讨论】:

    标签: sql mysql sql-order-by


    【解决方案1】:
     SELECT bloggers.*, COUNT(post_id) AS post_count
        FROM bloggers LEFT JOIN blogger_posts 
        ON bloggers.blogger_id = blogger_posts.blogger_id
        GROUP BY bloggers.blogger_id
        ORDER BY post_count
    

    (注意:MySQL 有特殊的语法,可以让您在不聚合所有值的情况下进行 GROUP BY,它正是针对这种情况而设计的。

    【讨论】:

    • 特殊语法是什么?
    • 在我的示例中显示的特殊语法是,与标准 SQL 不同,您 不必 必须在 GROUP BY 子句中包含 SELECT 子句中的所有非聚合列.在标准 SQL 中,您将无法在 SELECT 部分使用 bloggers.*。
    【解决方案2】:

    使用子查询。

    select * from (
        select post_from_blogger_id, count(1) N from Posts
        group by post_from_blogger_id) t
    order by N desc
    

    【讨论】:

    • 子查询不是必须的。
    【解决方案3】:

    试试这个:

    SELECT B.blogger_id,
           B.blogger_name,
           IFNULL(COUNT(P.post_from_blogger_id ),0) AS NumPosts 
    From Blogger AS B
    LEFT JOIN Posts AS P ON P.post_from_blogger_id = B.blogger_id
    GROUP BY B.blogger_id, B.blogger_name
    ORDER BY COUNT(P.post_from_blogger_id ) DESC
    

    这将连接 2 个表,并计算 Posts 表中的条目数。如果没有,则计数为 0 (IFNULL)。

    【讨论】:

    • 你真的需要 IFNULL 吗?如果没有遇到非 NULL post_from_blogger_id 值,COUNT 不应该返回 0 吗?
    • 现在您已经添加了 GROUP BY,您可以利用 MySQL 并在分组列列表中仅包含 blogger_id。
    【解决方案4】:
    SELECT b.*
    FROM Bloggers AS b
    LEFT JOIN (
      SELECT post_from_blogger_id, COUNT(*) AS post_count
      FROM Posts
      GROUP BY post_from_blogger_id
    ) AS p ON b.blogger_id = p.post_from_blogger_id
    ORDER BY p.post_count DESC
    

    【讨论】:

      【解决方案5】:

      为这个问题尝试 LEFT JOIN

      SELECT DISTINCT(Bloggers.blogger_id),
      (select  count(post_from_blogger_id) from Posts 
      where Posts.post_from_blogger_id=Bloggers.blogger_id) post_from_blogger_id FROM Bloggers 
      LEFT OUTER JOIN Posts ON Bloggers.blogger_id=Posts.post_from_blogger_id 
      ORDER BY post_from_blogger_id DESC
      

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题。这些答案对我没有帮助。我用了这样一个查询:

        SELECT *
        FROM company c
        ORDER BY (select count(a.company_id) from asset a where a.company_id = c.id) DESC
        

        对于这个问题:

        SELECT *
        FROM bloggers b
        ORDER BY (select count(p.post_from_blogger_id) from posts p where p.post_from_blogger_id = b.blogger_id) DESC
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-29
          • 1970-01-01
          • 2018-06-14
          相关资源
          最近更新 更多