如何在MYSQL中选择下面的项目和上面的项目

时间:2009-06-13 18:12:13

标签: mysql

我有一个ID为非整数的数据库:

b01
b02
b03
d01
d02
d03
d04
s01
s02
s03
s04
s05

等。这些字母代表产品的类型,即该组中下一个的数字。

我希望能够选择一个ID,比如d01,然后回到b03,d01,d02。我如何在MYSQL中执行此操作?

6 个答案:

答案 0 :(得分:2)

以下是使用UNION s执行此操作的另一种方法。我认为这比接受的答案更容易理解和更灵活。请注意,该示例假定id字段是唯一的,根据您的问题似乎就是这种情况。

下面的SQL查询假设您的表名为demo,并且只有一个唯一的id字段,并且表格中已填充了您在问题中列出的值。

( SELECT id FROM demo WHERE STRCMP ( 'd01', id ) > 0 ORDER BY id DESC LIMIT 1 )
UNION ( SELECT id FROM demo WHERE id = 'd01' ORDER BY id ) UNION 
( SELECT id FROM demo WHERE STRCMP ( 'd01', id ) < 0 ORDER BY id ASC LIMIT 1 ) 
ORDER BY id

它产生以下结果:b03, d01, d02

此解决方案非常灵活,因为您可以将每个LIMIT 1语句更改为LIMIT N,其中N是任意数字。这样,您可以获得前三行和后面的6行,例如。

答案 1 :(得分:1)

注意:这是来自M $ SQL Server,但唯一需要调整的是isnull函数。

select *
from test m
where id between isnull((select max(id) from #test where col < 'd01'),'d01')
             and isnull((select min(id) from #test where col > 'd01'),'d01')

答案 2 :(得分:0)

找到目标行

SELECT p.id FROM product WHERE id = 'd01'

和它上面的行,两者之间没有其他行。

LEFT JOIN product AS p1 ON p1.id > p.id    -- gets the rows above it

LEFT JOIN       -- gets the rows between the two which needs to not exist
        product AS p1a ON p1a.id > p.id AND p1a.id < p1.id

并且类似于它下面的行。 (留给读者练习。)

根据我的经验,这也非常有效。

    SELECT
        p.id, p1.id, p2.id
    FROM
        product AS p
    LEFT JOIN
        product AS p1 ON p1.id > p.id
    LEFT JOIN 
        product AS p1a ON p1a.id > p.id AND p1a.id < p1.id
    LEFT JOIN
        product AS p2 ON p2.id < p.id
    LEFT JOIN 
        product AS p2a ON p2a.id < p.id AND p2a.id > p2.id
    WHERE
        p.id = 'd01'
        AND p1a.id IS NULL
        AND p2a.ID IS NULL

答案 3 :(得分:0)

虽然不能直接回答你的问题,但我个人不会依赖于自然顺序,因为它可能会改变二进制导入/导出并产生其他程序员不易理解的副作用。如何创建备用INTEGER索引并启动另一个查询? “WHERE id&gt; ... yourdesiredid ... LIMIT 1”?

答案 4 :(得分:0)

mysql> describe test;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | varchar(50) | YES  |     | NULL    |       | 
+-------+-------------+------+-----+---------+-------+

mysql> select * from test;
+------+
| id   |
+------+
| b01  | 
| b02  | 
| b03  | 
| b04  | 
+------+

mysql>  select * from test where id >= 'b02' LIMIT 3;
+------+
| id   |
+------+
| b02  | 
| b03  | 
| b04  | 
+------+

答案 5 :(得分:0)

使用游标怎么样?这将允许您一次遍历返回的一行。使用它有两个变量(如“当前”和“最后”),你可以沿着结果尺寸,直到你击中你的目标。然后返回“last”(对于n-1)的值,输入的目标(n),然后再遍历/迭代一次并返回“当前”(n + 1)。