直接在 IN (SELECT ... LIMIT n) 中使用 LIMIT 會報錯:
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, uid DESC LIMIT 0,10
);
將帶 LIMIT 的子查詢包裝在一層 SELECT ... FROM ( ... ) AS tmp 中:
SELECT infor.name, infor.phone, infor.add,
mconfig.mname, mapply.acount,
FROM_UNIXTIME(mapply.atime, '%Y-%m-%d') AS atime
FROM mapply
RIGHT JOIN infor ON mapply.uid = infor.uid
INNER JOIN mconfig ON mapply.mid = mconfig.mid
WHERE mapply.aid IN (
SELECT aid FROM (
SELECT `aid` FROM `mapply`
WHERE state = 1
ORDER BY `atime`, `uid` DESC
LIMIT 0,10
) AS `tp`
);
SELECT ... LIMIT 物質化為一個臨時表(衍生表),外層 IN 則是對這個臨時表查詢,繞過了語法限制。JOIN:SELECT ...
FROM mapply
JOIN (
SELECT aid FROM mapply WHERE state = 1 ORDER BY atime, uid DESC LIMIT 10
) AS tmp ON mapply.aid = tmp.aid
RIGHT JOIN infor ON ...
INNER JOIN mconfig ON ...;
mapply(state, atime, uid) 有合適的複合索引,避免 filesort。IN 子查詢不可直接 LIMIT → 用衍生表包裝 → 或改寫為 JOIN 提升效能。