这是包含一些数据的表
+-----+-------+--------+-----------+------------+-------+------------+---------------------+-------------------+
| 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的所有行,然后对第一个查询的结果进行第二次查询,以找到列出的每个级别的最大星数。从我已经完成的研究中,左内连接可以完成这项工作,但是我使用单个表时难以使用别名。
答案 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
注意我为场景添加了
case
子句,如果用户id,level和numOfStars相等,那么它将根据最高得分选择行