mysql获取下一行和上一行

时间:2013-12-18 08:36:38

标签: mysql

这是我从堆栈溢出中获得的示例查询。我理解它是如何工作的,但如果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)

3 个答案:

答案 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会产生相同的结果。但如果idauto 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