MySQL怎么查询排序后结果集的前[N, M]条记录

今天群里有人提了这么一个问题,原话是:
[i]“表T(a,b,c,d),怎么显示按c排序之后的21-30条记录。(a,b,c,d)中可能没有类似ID的属性”[/i]

我当时给出的答案是:
[b]select * from T order by c where rownum in (21, 30);[/b]
不过后来想想可能这在MySQK上是不可行的。貌似只有Oracle支持吧。

先总结些流行数据库查询前N条记录的方法吧:
1、[b]MySQL[/b]:
;这里取N为5
select * from T order by c limit 5;
2、[b]SQL Serve[/b]r:
select top 5 * from T order by c;
3、[b]Oracle[/b]:
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上执行不了,为什么呢?错误信息是:
[i]ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/AN
Y/SOME subquery'[/i]

在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);

但是,只要你[b]再来一层[/b]就行。。如:
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))”。

所以最后我给出的答案是:
[b]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);[/b]

虽然答案有点长,但是执行效率还是不算低的。如果大家有什么[b]更好的方法[/b],欢迎拍砖和指正。

[color=red]更正:
[url="http://shinwell.iteye.com/"]shiwell[/url]给出了很简单的答案,我当时对Limit的用法不是很会,这里学习了,顺便感谢shinwell。
他给的答案是:
select * from T order by c LIMIT 21, 30 [/color]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值