今天群裡有人提了這麼一個問題,原話是:
“表T(a,b,c,d),怎麼顯示按c排序之後的21-30條記錄。(a,b,c,d)中可能沒有類似ID的屬性”
我當時給出的答案是:
select * from T order by c where rownum in (21, 30);
不過後來想想可能這在MySQK上是不可行的。貌似只有Oracle支援吧。
先總結些流行資料庫查詢前N條記錄的方法吧:
1、MySQL
:
;這裡取N為5
select * from T order by c limit 5;
2、SQL Serve
r:
select top 5 * from T order by c;
3、Oracle
:
select * from T order by c where rownum<5;
然後我針對MySQL給出了一條語句:
select A.* from T as A order by A.a limit 5 where A.a not in
(select B.a from T as B order by B.a limit 3);
這條語句在我現在這個版本的MySQL上執行不了,為什麼呢?錯誤資訊是:
ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/AN
Y/SOME subquery'
在MySQL4.1中子查詢是不能使用LIMIT的,手冊中也明確指明 This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME subquery’
也就是說,這樣的語句是不能正確執行的。
select * from table where id in (select id from table limit 10);
但是,只要你再來一層
就行。。如:
select * from table where id in (select t.id from (select * from table limit 10)as t)
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME
subquery'的意思是,這版本的 MySQL 不支援使用 LIMIT 子句的 IN/ALL/ANY/SOME 子查詢,即是支援非
IN/ALL/ANY/SOME 子查詢的 LIMIT 子查詢。
歧義點在於各生字的 apply 和組合順序,這句子的正確結合順序是 “This version of MySQL doesn’t yet
support ((LIMIT-(IN/ALL/ANY/SOME)) subquery)” (”-”符號為hyphen ),有可能的錯誤理解是
“This version of MySQL doesn’t yet support ((LIMIT subquery) &
((IN/ALL/ANY/SOME) subquery))”。
所以最後我給出的答案是:
select * from T as C where C.c in (select p.* from (select A.c from T as A order by A.c limit 30) as p)
and C.c not in
(select q.* from (select B.c from T as B order by B.c limit 21) as q);
雖然答案有點長,但是執行效率還是不算低的。如果大家有什麼更好的方法
,歡迎拍磚和指正。
From:http://hi.baidu.com/%CD%F4%EC%CF%CF%E8/blog/item/f6ac3cc960dd641e7f3e6fa9.html