【问题标题】:use COUNT(*) values from one table to another使用从一个表到另一个表的 COUNT(*) 值
【发布时间】:2016-12-21 21:56:46
【问题描述】:

假设我有两个表,用户和帖子。帖子具有以下字段,用户 ID、帖子 ID 等,并且用户 ID 可以出现多次,因为一个用户可以写多个帖子....我只是尝试根据帖子表中每个用户 ID 的出现次数对用户表进行排序。我可以使用这个来获得每个用户的出现次数

    SELECT userid, COUNT(*) 
    FROM posts
    GROUP BY userid; 

我想使用 COUNT(*) 列下的值,也许将其添加到我的另一个表中,因为这样我就可以简单地添加到这样的值

  SELECT * FROM users
  ORDER BY newcolumn ASC;  

但我在这样做时遇到了麻烦。或者我可以在不添加额外列的情况下做到这一点吗?请提示。谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

    Left join 是这里的关键!

    SELECT users.userid,count(posts.userid) AS total_count
    FROM users
    LEFT JOIN posts on posts.userid = users.userid
    GROUP BY users.userid
    ORDER BY total_count DESC;
    

    我们将left join 放在两个具有相同user_id 的桌子上,并且我们正在使用group by 计算每个用户的帖子总数。最后sort按计数并显示结果。

    【讨论】:

    • 嘿,我是第一个,但你的代表。把你推到了顶峰。 ;-)
    • 那我给你一个:)
    • 您需要使用count(posts.userid)。否则,即使没有匹配项,您也会得到 1 的计数,因为它将计算具有空值的行。
    • 是的。正确的。错过了那件事。
    【解决方案2】:

    试试left join

    select users.userid, [user fields],count(postid) as posts_count
    from users
    left join posts on posts.userid = users.userid
    group by users.userid,[user fields]
    order by posts_count desc.
    

    【讨论】:

      【解决方案3】:

      您想选择用户 (FROM users) 但您想根据另一个表 (COUNT(*) FROM posts) 中的条件进行排序 - 因此您需要使用 JOIN

      如果您想获得表的笛卡尔积然后在单个字段上进行分组和聚合,我似乎不记得是否需要“JOIN”、“RIGHT JOIN”或“FULL JOIN” ,但我可以避免需要记住子查询(希望有人很快会发布一个更小更聪明的答案):

      SELECT users.* FROM users
      JOIN (
          SELECT userid, COUNT(*) as count
          FROM posts
          GROUP BY userid
      ) as subquery ON users.id = subquery.userid
      ORDER BY subquery.count
      

      注意:我没有测试过这个查询,但它看起来不错。再说一遍:希望有人会尽快发布更好的答案,因为我没有尽职尽责,但你肯定需要JOIN :)

      【讨论】:

      • 这将默认为内部联接,并且仅显示有帖子的用户。不是没有帖子的用户。
      【解决方案4】:

      您可以在 users 表中添加一个 post_count 列,但您还必须在每次用户创建新帖子时更新该计数列,并且您必须将该逻辑构建到您的应用程序中。

      否则,FallAndLearn 的答案似乎可以满足您的需求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-08
        • 1970-01-01
        • 2015-04-15
        • 2014-07-29
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        相关资源
        最近更新 更多