2012-03-06 3 views
11

Как выбрать строки в обратном порядке (DB MySQL)?Как выбрать строки в обратном порядке (mysql)

For example, 
I have a table with 12 rows (fields: id,location), I want select -4th row before a row with id = 6, 
i.e. wanted row will have id = 'not necessarily 2', 
    but there is condition - where table.location='some_location'. 

Каким должно быть содержание запроса к mysql?




Editted на 30 Minut позже.
Вот решение! Некоторые примеры, я проверил предложение drodil по так:

mysql> select * from subscrs where id < 100000 order by id desc limit 4; 
+-------+--------+-----------+-------+ 
| uid | subscr | event  | id | 
+-------+--------+-----------+-------+ 
| 5307 | 5123 | feed_news | 99999 | 
| 25985 | 5211 | feed_news | 99998 | 
| 15123 | 130 | feed_news | 99997 | 
| 28368 | 19497 | feed_news | 99996 | 
+-------+--------+-----------+-------+ 
4 rows in set (0.00 sec) 

Drodil, спасибо!

+3

Я не уверен, чего вы пытаетесь достичь, выбрав строку с идентификатором 4 под идентификатором, который был поставлен. Просьба предоставить более подробную информацию, потому что я думаю, что, вероятно, есть лучшее решение вашей проблемы. – aaroncatlin

+1

Можете ли вы прояснить свой вопрос, возможно, включив некоторые примеры данных и как вы хотите, чтобы он был заказан? На данный момент я не понимаю, что вы хотите сделать. –

+1

Что произойдет, если ваш идентификатор будет автоматически увеличиваться, а кто-то удалил строку id 2 в вашем случае, что тогда делать? Что произойдет, если предоставленный идентификатор равен 2, так что четыре строки ранее имели бы идентификатор -1 (не существующий)? –

ответ

20

Или вы могли бы сделать это, не обращая внимания на удаленные результаты, просто получить четвертый до данного идентификатора (6):

SELECT * FROM SomeTable WHERE id < 6 ORDER BY id DESC LIMIT 4,1 
2

4-я строка перед данной строкой или 4-й идентификатор перед данным ID? Возможно, идентификаторы отсутствуют из-за удаленных записей (то есть .. Идентификаторы 101, 102, 104, 105, 111, ...) ... Если вам просто нужен ID 4 меньше, чем какой-либо другой идентификатор по любой причине (я бы согласился подробнее здесь должно быть дано, так как, скорее всего, лучшим решением!), то вы можете просто сделать

SELECT * FROM SomeTable WHERE ID=6-4 

вы можете расширить, что если вы хотите, идентификатор 4 меньше, чем идентификатор строки, содержащий конкретное место с

SELECT * FROM SomeTable WHERE ID = (SELECT ID FROM SomeTable WHERE Location='Germany')-4 

Но опять же, пожалуйста, поделитесь некоторые примеры данных, и что вы пытаетесь достичь/почему вы собираетесь сделать это таким образом - это не логичное решение. Если идентификатор 2 был удален, или если поле «Местоположение» не содержит уникальных данных, это будет прерываться. Должен быть лучший дизайн для того, что вы пытаетесь сделать, но вам нужно предоставить более подробную информацию для этого.

+0

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

+0

Да, я, конечно, согласен - пользователь должен иметь жесткий контроль над БД, чтобы это работало, и даже тогда это совершенно ужасный способ делать и приближаться к вещам. Но насколько я могу понять вопрос о том, что это такое, это то, о чем он просит. – maxx233

+0

Извините, я не полностью объяснил! См. Отредактированный вопрос выше! –

1

если мой mindreading все еще работает, вы, вероятно, нужно что-то вроде этого:

select t1.location, t2.location 
from mytable t1 
join mytable t2 on t2.id = t1.id - 4 
where t1.location = 'some_location' 
1

В последнем запросе просьба добавить ORDER BY id DESC для получения данных от последнего до первого.

ИЛИ

Для соглашаясь заказ вы можете просто добавить ORDER BY id ASC.