这是我的表:
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的行。所以,我知道我在id 4,条件是b ='x',顺序是c。我想得到下一行(id为13)和前一行(id为15)。我可以通过SQL查询从数据库中找到这些,还是我必须检索所有内容并在我的代码中循环它?
答案 0 :(得分:1)
您可以使用limit子句来执行此操作。
但是当数据已经在PHP中时,在sql中执行此操作似乎没有任何意义。为什么不将行放入每行包含元素的数组中,并使用数组的指针来实现这一点?
prev(),current()和next()函数应该是你所需要的。
答案 1 :(得分:0)
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;
当然,如果你真的想从数据库中一次读取一个条目,那就是这样。
答案 2 :(得分:0)
我过去使用查询(使用您的示例)完成此操作,例如:
SELECT id FROM ps WHERE id>'4' ORDER BY c LIMIT 1
对于下一个ID和前一个id:
SELECT id FROM ps WHERE id < '4' ORDER BY c LIMIT 1
这种方法显然需要额外的查询,但我真的从未找到过这样做的好方法。