如何在SQL中指定一个后找到下一条记录?

时间:2008-12-31 13:46:20

标签: mysql

我想使用单个SQL查询(在MySQL中)来查找我指定的记录之后的记录。

即表,如果表格有:

id, fruit
--  -----
1   apples
2   pears
3   oranges

我希望能够进行如下查询:

SELECT * FROM table where previous_record has id=1 order by id;

(显然这不是真正的SQL语法,我只是用伪SQL来说明我想要实现的目标)

会返回:

2, pears

我目前的解决方案只是获取所有记录,并在PHP中查看它们,但这比我想要的慢。有更快的方法吗?

我会对返回两行的内容感到满意 - 即具有指定值的行和下一行。

编辑:抱歉,我的问题措辞严厉。不幸的是,我对“next”的定义不是基于ID,而是基于水果名称的字母顺序。因此,我上面的例子是错误的,应该返回橙子,因为它在苹果之后按字母顺序排列。有没有办法对字符串而不是ID进行比较?

10 个答案:

答案 0 :(得分:31)

在问题编辑和下面的简化之后,我们可以将其更改为

SELECT id FROM table WHERE fruit > 'apples' ORDER BY fruit LIMIT 1

答案 1 :(得分:7)

SELECT * FROM table WHERE id > 1 ORDER BY id LIMIT 1

更简单

更新:

SELECT * FROM table  WHERE fruit > 'apples' ORDER BY fruit LIMIT 1

答案 2 :(得分:1)

我不熟悉MySQL语法,但使用SQL Server,您可以使用“top”执行某些操作,例如:

SELECT TOP 1 * FROM table WHERE id > 1 ORDER BY id;

这假设id字段是唯一的。如果它不是唯一的(例如,外键),你可以做类似的事情,然后再加入同一个表。

由于我不使用MySQL,我不确定语法,但可以想象它是相似的。

答案 3 :(得分:1)

除非您指定排序顺序,否则我不相信SQL中可以使用“previous”或“next”的概念。默认情况下,RDBMS无法保证您的特定订单。如果您可以按某个列按升序或降序排序,那就是另一个问题。

答案 4 :(得分:1)

如此简单,不需要体操

Select * from Table
where id = 
    (Select Max(id) from Table
     where id < @Id)

或者,基于字符串@fruitName ='apples'或'oranges'等...

Select * from Table
where id = 
    (Select Max(id) from Table
     where id < (Select id from Table
                 Where fruit = @fruitName))

答案 5 :(得分:0)

我不知道MySQL SQL,但我仍然尝试

select n.id 
from   fruit n
,      fruit p
where  n.id = p.id + 1;

编辑:

select n.id, n.fruitname 
from   fruits n
,      fruits p
where  n.id = p.id + 1;

编辑两个:

Jason Lepack表示,如果存在差距,这种方法不起作用,这是真的,我应该更好地阅读这个问题。

我应该使用分析来对fruitname

上的结果进行排序
select id
,      fruitname
,      lead(id) over (order by fruitname)  id_next
,      lead(fruitname) over (order by fruitname) fruitname_next
from   fruits;

答案 6 :(得分:0)

这应该有效。字符串'apples'需要是一个参数。

使用字符串填写该参数,此查询将按字母顺序返回该项目后的第一个水果的整个记录​​。

与LIMIT 1方法不同,这应该是与平台无关的。

--STEP THREE: Get the full record w/the ID we found in step 2
select *
from 
  fruits fr
 ,(   
  --STEP TWO: Get the ID # of the name we found in step 1
  select
    min(vendor_id) min_id
  from 
    fruits fr1
   ,(
    --STEP ONE: Get the next name after "apples"    
    select min(name) next_name
    from fruits frx
    where frx.name > 'apples'
    ) minval
  where fr1.name = minval.next_name
  ) x
where fr.vendor_id = x.min_id;

相当于Oracle中的LIMIT 1方法(仅供参考)将是:

select *
from
  (
  select *
  from fruits frx
  where frx.name > 'apples'
  order by name
  )
where rownum = 1

答案 7 :(得分:0)

如果您使用MS SQL Server 2008(不确定是否可用于以前的版本)...

如果您尝试查找下一条记录并且没有可用的唯一ID来引用,请尝试使用ROW_NUMBER().请参阅this link

根据您的T-SQL技能的精确程度,您可以根据排序顺序创建行号。然后你可以找到不仅仅是上一个和下一个记录。在视图或子查询中使用它来查找相对于当前记录的行号的另一条记录。

答案 8 :(得分:0)

SELECT cur.id as id, nxt.id as nextId, prev.id as prevId FROM video as cur
  LEFT JOIN video as nxt ON nxt.id > cur.id
  LEFT JOIN video as prev ON prev.id < cur.id
WHERE cur.id = 12
ORDER BY prev.id DESC, nxt.id ASC
LIMIT 1

如果您希望该项目包含上一个和下一个项目,则此查询可让您做到这一点。

这也使您可以在数据中留空!

答案 9 :(得分:-2)

这个怎么样:

Select * from table where id = 1 + 1