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'所在的所有记录