在指定记录后给出X记录的SQL语句

问题描述:

是否可以编写一条SQL语句来检索包含条件Y的条件为Y的记录之后的X个连续记录?在指定记录后给出X记录的SQL语句

例如,由于该表:

id name 
------------------------------ 
1 aaa 
5 bbb 
10 ccc 
15 ddd 
20 eee 
25 fff 
30 ggg 

我先申请标准Z,像

SELECT * WHERE (id>4) AND (id<26) ORDER BY id ASC 

那么我留下了一个清单:

id name 
------------------------------ 
5 bbb 
10 ccc 
15 ddd 
20 eee 
25 fff 

我想要知道是否有可能从name ='ddd'(或其他一些标准Y)的这个列表中检索2条记录,即retu上例中的“ddd”和“eee”记录。

它必须可以直接在SQL中做到这一点,但恐怕我缺乏知道它的里程数。

+0

也许COUNT的组合() OFFSET()和LIMIT()? – JoshuaDavid 2011-03-17 20:19:50

SELECT * 
FROM yourTable 
WHERE id > 4 
    AND id < 26 
    AND id >= (SELECT min(id) 
       FROM yourTable 
       WHERE id > 4 
       AND id < 26 
       AND name = 'ddd' 
      ) 
ORDER BY id 
LIMIT 2 
; 

在你的措辞:

SELECT * 
FROM yourTable 
WHERE (criterionZ) 
    AND sortingField >= 
      (SELECT min(sortingField) 
       FROM yourTable 
       WHERE (criterionZ) 
       AND (criterionY) 
      ) 
ORDER BY sortingField 
LIMIT X 
; 
+0

非常感谢您使用更通用的伪版本,非常有帮助 – JoshuaDavid 2011-03-17 21:09:11

+0

注意:如果我们将DESC而不是ASC排序,则min()应该是max(),并且> =变成 JoshuaDavid 2011-03-17 21:11:00

+0

是,'MAX'而不是'> =':'... sortedField 2011-03-17 21:14:48

加限制条款

SELECT * WHERE (id>4) AND (id<26) ORDER BY id ASC limit 2,2 

编辑。

select * from table where id > (
select id from table where name = 'eee') 
order by id 
limit 2 

使得推定你的身份证号码是连续的,你可以使用子查询:

SELECT * FROM table WHERE id >= (SELECT id FROM table WHERE name = 'ddd' LIMIT 1) LIMIT 2 
+0

这会影响到重新计算*“criteriaZ”*。如果例如第一行有'id = 1,name ='ddd'',它会给出错误的结果。如果在子查询中添加AND ID> 4和ID 2011-03-17 20:44:57