MySQL 取得指定 type 中編號最大的武器的附屬欄位

MySQL 的 GROUP BY 選擇非 aggregate 的附屬欄位會造成不可預期結果的問題

我隨便找了一個資料來當範例

SELECT id, weapon_name, `type`, weapon_f_id FROM weapon_list;

這時候會取得的結果是

那麼 我現在假設要尋找 type=3 而且 weapon_f_id 最大的那把武器的名字
假設我用了以下的 SQL

SELECT id, weapon_name, `type`, MAX(weapon_f_id) FROM weapon_list GROUP BY `type`;

我得到的結果如下:

type=3 的資料並不是我預期的 神聖的暗標鎗

這個有幾種解決方法


第一種是 JOIN (索引建立正確時效率較好)

SELECT b.id, b.weapon_name, b.`type`, b.weapon_f_id FROM (
    SELECT MAX(weapon_f_id) AS weapon_f_id, `type` FROM weapon_list GROUP BY `type`
) AS a JOIN weapon_list AS b ON a.weapon_f_id = b.weapon_f_id AND a.`type` = b.`type`;


第二種是 subquery (效率普通)

SELECT id, weapon_name, `type`, weapon_f_id FROM weapon_list WHERE weapon_f_id IN (
    SELECT MAX(weapon_f_id) FROM weapon_list GROUP BY `type`
);


第三種也是 subquery (效率超差)

SELECT id, weapon_name, `type`, weapon_f_id FROM weapon_list AS a WHERE weapon_f_id = (
    SELECT MAX(weapon_f_id) FROM weapon_list WHERE `type` = a.`type`
);

建立索引

若要提升 JOIN 的執行效率,請嘗試建立索引並配合 EXPLAIN 查看。

這個例子的應該要對 weapon_f_idtype 建立一個雙欄位索引

請注意不是兩個欄位各建立一個索引