使用JOIN,如何获得此表的每个级别的最大numOfStars?

时间:2017-11-16 05:54:34

标签: mysql join left-join inner-join

这是包含一些数据的表

+-----+-------+--------+-----------+------------+-------+------------+---------------------+-------------------+
| id  | level | userId | numOfSecs | numOfStars | score | mostRecent | creationTime        | allLevelsFinished |
+-----+-------+--------+-----------+------------+-------+------------+---------------------+-------------------+
| 113 |     1 | 21     |        12 |          3 |  1000 |          1 | 2017-11-14 17:39:06 |                 0 |
| 114 |    10 | 21     |        25 |          3 |  1000 |          1 | 2017-11-14 17:41:21 |                 0 |
| 115 |     5 | 21     |        16 |          3 |  1000 |          1 | 2017-11-14 18:37:40 |                 0 |
| 119 |     1 | 23     |       194 |          1 |   200 |          0 | 2017-11-15 13:21:50 |                 0 |
| 120 |     1 | 23     |       121 |          1 |   444 |          0 | 2017-11-15 13:16:01 |                 0 |
| 121 |     1 | 23     |       221 |          3 |   333 |          0 | 2017-11-15 18:14:48 |                 0 |
| 122 |     1 | 23     |       343 |          2 |   555 |          0 | 2017-11-15 13:19:54 |                 0 |
| 123 |     1 | 23     |       355 |          1 |   555 |          1 | 2017-11-15 13:21:19 |                 0 |
| 124 |     2 | 23     |       333 |          1 |   333 |          0 | 2017-11-15 15:25:59 |                 0 |
| 125 |     2 | 23     |       444 |          2 |   444 |          0 | 2017-11-15 15:26:26 |                 0 |
| 126 |     2 | 23     |       222 |          2 |  2222 |          0 | 2017-11-15 15:26:59 |                 0 |
| 127 |     2 | 23     |        44 |          1 |   444 |          1 | 2017-11-15 15:27:24 |                 0 |
+-----+-------+--------+-----------+------------+-------+------------+---------------------+-------------------+

我知道我可以使用

SELECT id, userId, numOfSecs, level, max(numOfStars) 
WHERE userId=23 
GROUP BY level 

但是,我有兴趣更熟悉JOIN,即使JOIN通常与2个或更多表一起使用。我想用我的查询做的是选择userId = 23的所有行,然后对第一个查询的结果进行第二次查询,以找到列出的每个级别的最大星数。从我已经完成的研究中,左内连接可以完成这项工作,但是我使用单个表时难以使用别名。

1 个答案:

答案 0 :(得分:0)

你可以使用left join使用相同的表但on子句中的一些调整来选择最高的numOfStars行

select a.*
from demo a
left join demo b
       on a.userId = b.userId
       and a.level = b.level
       and case when a.numOfStars = b.numOfStars
                then a.score < b.score
                else a.numOfStars < b.numOfStars
                end
where b.id is null
and a.userId = 23

Demo

  

注意我为场景添加了case子句,如果用户id,level和numOfStars相等,那么它将根据最高得分选择行