試著寫一下我的語句和理解,比老師的更加有可讀性,好理解
老師給出的答案可讀性實在太差了,不直觀,不符合正常邏輯,老師又不作解釋。下面是我的語句:
SELECT c.user_name, c.timestr, c.kills FROM?
(SELECT a.id, a.user_name, b.timestr, b.kills FROM user1 a INNER JOIN user_kills b on a.id = b.user_id) c?
INNER JOIN user_kills d ON c.id = d.user_id AND c.kills <= d.kills
GROUP BY c.user_name, c.timestr
HAVING COUNT(*) <= 2
ORDER BY c.user_name, c.kills DESC;
2022-11-30
SELECT a.user_name, b.timestr, b.kills FROM user1 ainner join
?( select b.user_id, b.kills, max(b.timestr) as timestr from user_kills b?
? ?GROUP BY b.user_id, b.kills
?) b on a.id = b.user_id
INNER JOIN?
( select b.user_id, b.kills, max(b.timestr) as timestrfrom user_kills b?
? ?GROUP BY b.user_id, b.kills
) d?
ON a.id = d.user_id AND b.kills <= d.kills
GROUP BY b.kills?
HAVING COUNT(*) <= 2
ORDER BY a.user_name, b.kills DESC;
個人的一個修改,主要思路就是表連接之前先把重復的過濾(數據分組然后取最大的時間)
2021-01-16
可以把子查詢 c?去掉 ,改成兩次 inner join。
2020-01-10
1.括號中的子查詢連接兩張表,很好理解。
2.子查詢得到的集合再去連接user_kills表,條件c.id = d.user_id,很好理解。
條件c.kills <= d.kills的作用,使得殺怪最多的天數只出現一次,第二多的天數出現兩次,如此類推。
重復出現的次數,其實就等于殺怪數的排名。放兩個圖,不懂的人結合圖細細品一下。
3.GROUP BY c.user_name, c.timestr分組。GROUP BY有去除重復的作用,此時的表:
4.HAVING COUNT(*) <= 2,把重復出現次數小于等于2的保留,也就是殺怪最多的兩天。
有人可能會卡在這一步,覺得不好理解??梢越Y合第二步來看,雖然分組后看不到重復,但是通過函數可以計算出來。
再放個圖(沒加HAVING COUNT(*) <= 2的時候,而且增加count列,方便理解),還不懂就沒救了。
5.ORDER BY c.user_name, c.kills DESC,排序就不用解釋了吧。