MySQL下一个/上一个ID(任意排序顺序)

MySQL下一个/上一个ID(任意排序顺序),mysql,Mysql,这是我的桌子: mysql> describe ps; +-------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL

这是我的桌子:

mysql> describe ps;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment | 
| a     | text    | YES  |     | NULL    |                | 
| b     | text    | YES  |     | NULL    |                | 
| c     | text    | YES  |     | NULL    |                | 
+-------+---------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
假设我有如下数据:

mysql> select * from ps;
+----+------+------+------+
| id | a    | b    | c    |
+----+------+------+------+
|  1 | x    | x    | x    | 
|  2 | x    | y    | x    | 
|  3 | x    | z    | x    | 
|  4 | x    | x    | y    | 
|  5 | x    | x    | z    | 
|  6 | x    | y    | x    | 
|  7 | x    | y    | y    | 
|  8 | x    | y    | z    | 
|  9 | y    | x    | x    | 
| 10 | z    | x    | x    | 
| 11 | y    | y    | x    | 
| 12 | y    | z    | x    | 
| 13 | y    | x    | y    | 
| 14 | y    | x    | z    | 
| 15 | z    | x    | x    | 
| 16 | z    | y    | x    | 
| 17 | z    | z    | x    | 
| 18 | z    | x    | y    | 
| 19 | z    | x    | z    | 
+----+------+------+------+
19 rows in set (0.00 sec)
我的问题是:

mysql> select * from ps where b = 'x' order by c;
+----+------+------+------+
| id | a    | b    | c    |
+----+------+------+------+
|  1 | x    | x    | x    | 
|  9 | y    | x    | x    | 
| 10 | z    | x    | x    | 
| 15 | z    | x    | x    | 
|  4 | x    | x    | y    | 
| 13 | y    | x    | y    | 
| 18 | z    | x    | y    | 
|  5 | x    | x    | z    | 
| 14 | y    | x    | z    | 
| 19 | z    | x    | z    | 
+----+------+------+------+
10 rows in set (0.00 sec)

假设我有id为4的行。我知道我在ID4,条件是b='x',顺序是c。我想得到下一行(id 13)和上一行(id 15)。我可以通过SQL查询从数据库中找到它们吗?或者我必须在代码中检索所有内容并循环使用它吗?

您可以使用limit子句来执行此操作

但是,当数据已经在PHP中时,在sql中这样做似乎没有任何意义。为什么不将行放入一个每行有一个元素的数组中,并使用数组的指针来实现这一点呢


prev()、current()和next()函数应该是您所需要的所有函数。

您可以使用limit子句来完成此操作

select * from ps where b = 'x' order by c limit 4, 1;
但是,当数据已经在PHP中时,在sql中这样做似乎没有任何意义。为什么不将行放入一个每行有一个元素的数组中,并使用数组的指针来实现这一点呢

prev()、current()和next()函数应该是您所需要的全部函数

select * from ps where b = 'x' order by c limit 4, 1;
将获得第5个(4+1)元素,即id为4的元素

下一个也可以通过以下方式获取:

select * from ps where b = 'x' order by c limit 5, 1;
当然,如果您真的想从数据库中一次读取一个条目,就需要这样做

将获得第5个(4+1)元素,即id为4的元素

下一个也可以通过以下方式获取:

select * from ps where b = 'x' order by c limit 5, 1;

当然,如果您真的想从数据库中一次读取一个条目,就需要这样做。

我过去曾通过查询(使用您的示例)这样做过:

对于下一个id和上一个id:

SELECT id FROM ps WHERE id < '4' ORDER BY c LIMIT 1
从ps中选择id,其中id<'4'按c限制1排序

这种方法显然需要额外的查询,但我真的从来没有找到一个好的方法来实现它。

我以前用查询(使用您的示例)来实现这一点,例如:

对于下一个id和上一个id:

SELECT id FROM ps WHERE id < '4' ORDER BY c LIMIT 1
从ps中选择id,其中id<'4'按c限制1排序

这种方法显然需要额外的查询,但我真的从来没有找到一个好方法。唯一的区别是,如果有100万行,OP必须在客户端获取所有行(与SQL查询相比,SQL查询将在服务器端找到,而不必传输所有行)是的,同意。但是这个例子表明,他已经在检索所有记录,其中b='x'唯一的区别是,如果有100万行,OP必须在客户端获取所有记录(与SQL查询相比,SQL查询将在服务器端找到记录,而不必传输所有记录)是的,同意。但这个例子表明,他已经在检索b='x'所在的所有记录