SELECT user_id, timestr, kills , (SELECT COUNT(*) FROM kills AS b WHERE? b.user_id = a.user_id AND a.kills <= b.kills) AS cnt FROM kills a GROUP BY user_id, timestr, kills; 這一句實際上里邊還有一個子查詢 , SELECT COUNT(*) FROM kills AS b WHERE? b.user_id = a.user_id AND a.kills <= b.kills, 這句話的關鍵在于, a.kills <= b.kills 。意思是查出整個表中比 當前行的 kills(a表中) 大的 kills(b表中)的個數。而且 GROUP BY 子句是不必要的。
SELECT a.user_id, a.timestr, a.kills, COUNT(b.kills) AS cnt FROM kills AS a?? ? JOIN kills b ON a.user_id = b.user_id WHERE a.kills <= b.kills GROUP BY a.user_id, a.timestr, a.kills
2016-10-16
我們緊接上樓,內部優化完畢的sql是這樣的
SELECT d.user_name, c.timestr, kills FROM
(SELECT a.user_id, a.timestr, a.kills, COUNT(b.kills) cnt FROM kills AS a
JOIN kills b ON a.user_id = b.user_id
WHERE a.kills <= b.kills
GROUP BY a.user_id, a.timestr, a.kills) AS c
JOIN workteam d ON d.work_id = c.user_id WHERE cnt <=2;
由于 where 從句中的條件和 下面的這個子查詢相關聯,每進行一個次外圍查詢就要執行一次子查詢,效率不言自明。
SELECT a.user_id, a.timestr, a.kills, COUNT(b.kills) cnt FROM kills AS a
JOIN kills b ON a.user_id = b.user_id
WHERE a.kills <= b.kills
GROUP BY a.user_id, a.timestr, a.kills
我們繼續優化。
思路是這樣的,JOIN兩次 kills 表即可, 第一次關聯是為了 查找信息, timestr 和 kills。
第二次關聯是為了 使用 count() 函數統計 比 當前行 kills 大的 數量,供having 語句使用(
吐槽的各位看官,看到這里是不是發現和上節課老師所講的求每個人哪天打怪的數目最多的
思路如出一轍啊)。下面給出sql
SELECT c.user_name, a.timestr, a.kills ? FROM workteam c
JOIN kills a ON c.work_id = a.user_id
JOIN kills b ON a.user_id = b.user_id
WHERE a.kills <= b.kills
GROUP BY ?user_name, kills DESC, timestr
HAVING COUNT(b.kills) <= 2
細心的看管,已經發現我這里的表名稱, 表字段和老師演示的例子不盡相同。
kills 表對應 user_kills , workteam 對應 users1,
work_id 字段對應 id
2016-10-16
首先來看里邊的子查詢:
SELECT user_id, timestr, kills , (SELECT COUNT(*) FROM kills AS b WHERE? b.user_id = a.user_id AND a.kills <= b.kills) AS cnt FROM kills a GROUP BY user_id, timestr, kills;
這一句實際上里邊還有一個子查詢 , SELECT COUNT(*) FROM kills AS b WHERE? b.user_id = a.user_id AND a.kills <= b.kills, 這句話的關鍵在于, a.kills <= b.kills 。意思是查出整個表中比 當前行的 kills(a表中) 大的 kills(b表中)的個數。而且 GROUP BY 子句是不必要的。
這句話的效率是相當低的,因為 每執行一次外圍的 select ,就要執行一次里邊的select,先用 JOIN優化它。
SELECT a.user_id, a.timestr, a.kills, COUNT(b.kills) AS cnt FROM kills AS a?? ?
JOIN kills b ON a.user_id = b.user_id
WHERE a.kills <= b.kills
GROUP BY a.user_id, a.timestr, a.kills
這樣內層的優化就完成了,
那么怎么進行外層優化呢?這的確是一個問題