MySQL next / previous ids(任意排序顺序)

时间:2009-02-09 16:19:02

标签: mysql

这是我的表:

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查询从数据库中找到这些,还是我必须检索所有内容并在我的代码中循环它?

3 个答案:

答案 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

这种方法显然需要额外的查询,但我真的从未找到过这样做的好方法。

相关问题