代码之家  ›  专栏  ›  技术社区  ›  axsuul

需要关于如何在单个MySQL查询中执行此操作的建议吗

  •  2
  • axsuul  · 技术社区  · 16 年前

    这可以在一个MySQL查询中实现吗?基本上,我需要根据用户的响应数量对其进行排序。我有两张桌子

    table "users":
    id      username
    ------------------
    1       hunter
    2       loserville
    

    还有一个

    table "responses":
    id      user_id     response
    -------------------------------
    1         1            yes
    1         2            yes
    1         1            no
    1         1            yes
    

    我需要这样的东西

    SELECT users.id
    FROM users
        UNION ALL 
            SELECT COUNT(responses.id) As num_responses
            FROM responses
            WHERE user_id = users.id
    ORDER BY num_responses DESC
    

    不幸的是,它不起作用。有什么建议吗?如果你感到困惑,请告诉我!谢谢你抽出时间。

    3 回复  |  直到 16 年前
        1
  •  3
  •   Rubens Farias    16 年前
    SELECT users.id, users.username, count(*) as responses
    FROM   users LEFT JOIN responses
           ON users.Id = responses.user_id
    GROUP BY users.id, users.username
    ORDER BY count(*) DESC
    
        2
  •  1
  •   Quassnoi    16 年前

    SELECT  u.id, COUNT(r.id) AS cnt
    FROM    users u
    LEFT JOIN
            responses r
    ON      r.user_id = u.id
            AND r.response = 'yes'
    GROUP BY
            u.id
    ORDER BY
            cnt DESC
    

    或者这个:

    SELECT  u.id,
            (
            SELECT  COUNT(*)
            FROM    responses r
            WHERE   r.user_id = u.id
                    AND r.response = 'yes'
            ) cnt
    FROM    users u
    ORDER BY
            cnt DESC
    

    前者的速度通常更快 InnoDB MyISAM .

        3
  •  0
  •   Thirler    16 年前

    我猜你想用的是GROUPBY子句。

    SELECT users.id, COUNT(*) AS responses 
        FROM users JOIN responses ON users.id = responses.user_id 
        GROUP BY user_id ORDER BY responses DESC
    

    (如果不想从users表中获得任何信息,可以省略联接,只对响应进行查询。

    联接列出所有用户及其响应,然后统计条目数。