MySQL следующий / предыдущий идентификаторы (произвольный порядок сортировки) - PullRequest
1 голос
/ 09 февраля 2009

Вот мой стол:

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)

Допустим, у меня есть строка с идентификатором 4. Итак, я знаю, что у меня идентификатор 4, и что условие b = 'x', а порядок c. Я хочу получить следующую строку (идентификатор 13) и предыдущую строку (идентификатор 15). Могу ли я найти их из базы данных с помощью SQL-запросов или мне нужно извлечь все и выполнить цикл в моем коде?

Ответы [ 3 ]

1 голос
/ 09 февраля 2009

Вы можете использовать предложение limit для этого.

Но, похоже, нет смысла делать это в sql, когда данные уже есть в PHP. Почему бы не поместить строки в массив с элементом на строку и использовать указатель массива для достижения этой цели?

Функции prev (), current () и next () - это все, что вам нужно.

0 голосов
/ 09 февраля 2009

В прошлом я делал это с помощью запросов (для использования вашего примера), таких как:

SELECT id FROM ps WHERE id>'4' ORDER BY c LIMIT 1

Для следующего и предыдущего идентификатора:

SELECT id FROM ps WHERE id < '4' ORDER BY c LIMIT 1

Этот метод явно требует дополнительных запросов, но я действительно никогда не находил хороший способ сделать это.

0 голосов
/ 09 февраля 2009
select * from ps where b = 'x' order by c limit 4, 1;

даст вам 5-й (4 + 1) элемент с идентификатором 4.

Следующее может быть также получено с помощью:

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

Это, конечно, если вы действительно хотите читать записи по одной из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...