我有一个ID为非整数的数据库:
b01
b02
b03
d01
d02
d03
d04
s01
s02
s03
s04
s05
等。这些字母代表产品的类型,即该组中下一个的数字。
我希望能够选择一个ID,比如d01,然后回到b03,d01,d02。我如何在MYSQL中执行此操作?
答案 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)。