直接在 IN (subquery) 中加 LIMIT 報錯:
ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
SELECT * FROM mapply
WHERE aid IN (
SELECT aid FROM mapply WHERE state = 1 ORDER BY atime DESC LIMIT 10
);
SELECT
i.name, i.phone, i.addr,
c.mname, a.acount, FROM_UNIXTIME(a.atime, '%Y-%m-%d') AS atime
FROM mapply a
RIGHT JOIN infor i ON a.uid = i.uid
INNER JOIN mconfig c ON a.mid = c.mid
WHERE a.aid IN (
SELECT aid FROM (
SELECT aid FROM mapply WHERE state = 1 ORDER BY atime DESC LIMIT 10
) AS tp
);
SELECT aid ... LIMIT 10 先執行,產生結果集。SELECT aid FROM ( ... ) AS tp 將其物質化為**衍生表** (臨時表)。IN 讀取衍生表,此時無 LIMIT,語法合法。SELECT
i.name, i.phone, i.addr,
c.mname, a.acount, FROM_UNIXTIME(a.atime, '%Y-%m-%d') AS atime
FROM mapply a
RIGHT JOIN infor i ON a.uid = i.uid
INNER JOIN mconfig c ON a.mid = c.mid
INNER JOIN (
SELECT aid FROM mapply WHERE state = 1 ORDER BY atime DESC LIMIT 10
) AS tp ON a.aid = tp.aid;
IN 子查詢潛在優化劣勢 (早期版本)。tp 的其他欄位 (如排序鍵)。mapply(state, atime) 有**複合索引**支援 WHERE state=1 ORDER BY atime DESC LIMIT 10。derived_merge=on 會自動嘗試合併衍生表,效能等同 JOIN。LIMIT 100000, 10) 需改用游標/延遲關聯,不適用此法。IN 子查詢 + LIMIT → 包一層衍生表 (AS tp) 繞過語法限制;實務首選 JOIN 衍生表 寫法,優化器友善、語義明確。