【问题标题】:mysql select top unique values with inner joinmysql使用内部连接选择顶部唯一值
【发布时间】:2012-09-09 11:46:46
【问题描述】:

我有 2 个如下所示的表:

users (uid, name)
-------------------
|  1  |  User 1   |
|  2  |  User 2   |
|  3  |  User 3   |
|  4  |  User 4   |
|  5  |  User 5   |
-------------------

highscores (user_id, time)
-------------------
|  3 |   12005    |
|  3 |   29505    |
|  3 |   17505    |
|  5 |   19505    |
-------------------

我只想查询具有高分的用户,并且只查询每个用户的最高分。结果应如下所示:

------------------------
|  User 3 |   29505    |
|  User 5 |   19505    |
------------------------

我的查询如下所示:

SELECT user.name, highscores.time
FROM user
INNER JOIN highscores ON user.uid = highscores.user_id
ORDER BY time ASC 
LIMIT 0 , 10

实际上这会返回同一用户的多个高分。我也尝试对它们进行分组,但它不起作用,因为它没有返回最佳结果而是随机结果(例如:对于用户 id 3,它返回 17505 而不是 29505)。

非常感谢!

【问题讨论】:

    标签: mysql select inner-join


    【解决方案1】:

    您应该将聚合函数MAX()group by 子句一起使用。

    SELECT  a.name, MAX(b.`time`) maxTime
    FROM    users a
            INNER JOIN highscores b
                on a.uid = b.user_id
    GROUP BY a.name
    

    SQLFiddle Demo

    【讨论】:

      【解决方案2】:

      您对用户进行分组的努力是正确的。您只需要使用MAX(time) 聚合函数,而不是只选择time

      我认为你写的旧查询是这样的:

      SELECT name, time 
      FROM users 
      INNER JOIN highscores ON users.uid = highscores.user_id 
      GROUP BY name,time
      

      但实际查询应该是:

      SELECT user.name, MAX(`time`) AS topScore
      FROM users 
      INNER JOIN highscores ON users.uid = highscores.user_id
      GROUP BY user.name
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        • 1970-01-01
        • 2017-08-30
        • 2013-12-16
        • 2011-12-13
        相关资源
        最近更新 更多