[MySQL] Порядок сортировки и LIMIT

kruzer25

Чтобы получить первые десять записей в прямом порядке, можно использовать ORDER BY xxx ASC LIMIT 10, чтобы последние десять в обратном - ORDER BY xxx DESC LIMIT 10, а как получить первые 10 в обратном порядке, без вложенных запросов?

6yrop

хочешь приколоться как Шаллер?

kruzer25

Хочу узнать, сможет ли Шаллер с минимальными затратами крови перевернуть треды.

6yrop

если xxx это дата, то можно так
ORDER BY '2015-01-01' - xxx ASC LIMIT 10

kruzer25

xxx - это порядок сортировки, там может быть всё, что угодно. Меня интересует, как сделать это в общем случае, то есть, как свернуть в один одноуровневый селект
SELECT * FROM (SELECT myfields FROM mytables ORDER BY myorder ASC LIMIT num) as qqq ORDER BY myorder DESC

6yrop

в общем случае хз, а зачем тебе в общем случае?

kruzer25

Интересно.

korsar0156

видимо никак, разе что зная общее количество строк
SELECT myfields FROM mytables ORDER BY myorder DESC LIMIT ($total-$num $num

stat7819605



SELECT myfields FROM mytables ORDER BY myorder DESC LIMIT ($total-$num $num
SELECT myfields FROM mytables ORDER BY myorder DESC LIMIT (COUNT(myfild)-$num $num
хотя это не то что просили )

kruzer25

В общем, это типа второй вариант - SELECT myfields FROM mytablesSELECT COUNT(*) as count FROM mytables WHERE mycondition) as xxx WHERE mycondition ORDER BY myorder LIMIT (xxx.count-numnum.
Всё равно вложенные селекты выходят.
Неужели нет никакого нормального способа это проделать?

kruzer25

В принципе, как вариант - чтобы расставлялись номера строк во внутреннем селекте (в моём первом примере а потом сортировать уже по этим номерам (а не по первоначальному условию сортировки но это, насколько я понимаю, в простом mysql не сделать - нужны какие-то "триггеры" или что-то такое...

Vodnik

не понимаю, а в чем проблема вложенных запросов?

kruzer25

Время.
Например, будет упорядочиваться уже упорядоченный запрос (1й вариант из моих постов или два раза будет проверяться условие WHERE (2й вариант из моих постов да и простой запрос переписывать под то, чтобы сортировать в обратную сторону в обоих случаях - не так уж и легко, как просто, например, заменить ASC на DESC.

Vodnik

имхо второй вариант вообще глючный - его нельзя использовать, потому что Limit 10000,10 будет в дохуя раз медленнее работать чем limit 10 взятый с другой стороны
а в первом при первом селекте обрабыватывается 10 (например) и при втором селекте 10, если делать ордер бу по индексному полю, то потяре времени будет незначительно по сравнению с генерацией кода по этой инфе имхо

kruzer25

А если делается order by что-то, что достаточно медленно считается?

Vodnik

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

kruzer25

Тем не менее, а если 1000 записей из 1100?
Все эти способы решения с вложенными селектами - слишком иззвращённые, должен быть способ сделать всё это напрямую.

Marinavo_0507

> если делать ордер бу по индексному полю
по моему опыту, MySQL такую оптимизацию не умеет (правда, 5.x не пробовал): в любом случае всё выбирает, и всё сортирует
Если б умел, форум бы намного быстрее работал
Оставить комментарий
Имя или ник:
Комментарий: