2009-02-09 3 views
1

Вот мой стол: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-запросов или мне нужно получить все и пропустить его в моем коде?

ответ

1

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

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

Функции prev(), current() и next() должны быть все, что вам нужно.

+0

Единственное различие заключается в том, что если имеется 1 миллион строк, OP должен будет получить их все на стороне клиента (по сравнению с SQL-запросом, который найдет его на сервере, без необходимости передавать все это) –

+0

да, согласился. но пример показывает, что он уже извлекает все записи, где b = 'x' – benlumley

0
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; 

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

0

Я делал это в прошлом, с запросами (использовать пример) как:

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

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

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

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

Смежные вопросы