这是我从堆栈溢出中获得的示例查询。我理解它是如何工作的,但如果id
是主键,那么整个order by id desc/asc
是否无效?我的意思是id<4
不会返回更高的关键是吗?并不是整个order by
只会减慢查询速度吗?
select * from table where id=4 limit 1
union all
(select * from table where id<4 order by id desc limit 1)
union all
(select * from table where id>4 order by id asc limit 1)
答案 0 :(得分:2)
SQL表没有默认顺序。
您可能会注意到,在MySQL / InnoDB中,如果ID
是您的主键,则以下两个查询将返回相同的结果:
SELECT * FROM table WHERE id>4 ORDER BY id ASC LIMIT 1
SELECT * FROM table WHERE id>4 LIMIT 1
因为在MySQL / InnoDB中,记录通常按主键排序:但没有记录,并且无法保证您将始终获得下一条记录。以下两个查询在MySQL / InnoDB中也有所不同:
SELECT * FROM table WHERE id<4 ORDER BY id DESC LIMIT 1
SELECT * FROM table WHERE id<4 LIMIT 1
如果您的表中存在id = 3,则第一个查询将返回该行,而第二个查询可能返回id = 3,但它(可能无法保证)返回该行ID最小的,例如id = 1。
作为一般规则,当您在查询中使用ORDER BY
时,总是需要使用LIMIT
子句,否则可能无法确定结果行。
答案 1 :(得分:0)
仅限primary key
,并不保证删除order by
会产生相同的结果。但如果id
为auto incremented
,则为是。
答案 2 :(得分:-1)
那么,
在第二个选择中,从上到下按4
{Id}的顺序小于DESCENDING
。
在第三个选择中,它按4
顺序排列Id大于ASCENDING
的顺序。
我认为这是因为他首先想要Id 4
,然后是第一个低于4
的值,然后是4
以上的最高值。
所以他想要的结果是4,lower than 4,higher than 5
。如果这是实现这一目标的正确方法,可以讨论。
它不会显着减慢查询速度,它总共获得3条记录并且通过PK排序非常有效。
由于ORDER BY
通常会按< 4
顺序选择第一个ID,因此ASC
已存在。
试试这个
CREATE TABLE `id` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
添加6行。
INSERT INTO `id` (`Id`) VALUES ('2');
INSERT INTO `id` (`Id`) VALUES ('3');
INSERT INTO `id` (`Id`) VALUES ('4');
INSERT INTO `id` (`Id`) VALUES ('5');
INSERT INTO `id` (`Id`) VALUES ('6');
运行此
SELECT * FROM id WHERE Id < 5 LIMIT 1;
如果没有ORDER BY
,则会选择ID 1。因此,虽然“但主键不会在表格中出现故障”,但如果DESC
没有订单,它将会命令ASC
。