Сортировка в php и mysql с лимитом

Amigo_9876
На сайте с 01.04.2009
Offline
305
348

Есть запрос к БД, которым сортируем и выводим по критериям.

$query = "SELECT SQL_CALC_FOUND_ROWS * FROM ".$this->_tbl." as obj INNER JOIN #__users ON (id=obj_author) WHERE ".$where. " ORDER BY obj_top DESC, IF(`obj_price1`!='',1,0) || IF(`obj_price2`!='',1,0) DESC, obj_id ASC LIMIT ".$from.",10"; //

Нужно добавить определенное условие к сортировке: Объекты (строки) опубликованные в промежуток 1-2 года назад, в количестве до 5 штук. Дата хранится в бд в формате секунд от 1970 года. в столбце obj_date.

Я так понимаю, сортировку можно сделать как то так:

IF (unix_timestamp(now()) - obj_date > 31556926) && (unix_timestamp(now()) - obj_date < 63056926) DESC

А как к ней прилепить лимит в 5 объектов?

То есть хочу, чтобы сначала шли объекты в порядке снижения по значению obj_top

Потом 5 объектов попадающих под критерий публикации от 1 до 2 лет назад, с сортировкой по этой самой дате.

А далее как сейчас.

Меняюсь ссылками с украинских PBN (стройка, техника, грузоперевозки)
Aisamiery
На сайте с 12.04.2015
Offline
293
#1

Вообще не понятно что вы хотите.

Сформулируйте ваш вопрос по точнее. НЕ совсем понятно при чем тут сортировка, если вы говорите про условие выборки:

Объекты (строки) опубликованные в промежуток 1-2 года назад

И что вы хотите получить этим выражением?

IF(`obj_price1`!='',1,0) || IF(`obj_price2`!='',1,0) DESC

У IF есть конкретное описание


IF(expr1,expr2,expr3)
Если expr1 равно значению ИСТИНА (expr1 <> 0 и expr1 <> NULL), то функция IF() возвращает expr2, в противном случае - expr3.

В текущем варианте получается что то типа

1 || 1 DESC

А в вашем варианте вы вообще опустили expr2 и expr3

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
IL
На сайте с 20.04.2007
Offline
435
#2
Amigo_9876:
То есть хочу, чтобы сначала шли объекты в порядке снижения по значению obj_top
Потом 5 объектов попадающих под критерий публикации от 1 до 2 лет назад, с сортировкой по этой самой дате.

UNION в помощь..

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
Amigo_9876
На сайте с 01.04.2009
Offline
305
#3

Aisamiery, Я хз, так как это писал год назад. Я так предполагаю, что если условие выполняется, то 1 = true, и строки показываются, а 0 - не показываются.

А саму сортировку, более тщательно погуглил, и сделал так.

UNIX_TIMESTAMP() -`obj_date` BETWEEN 31101100 and 62100000 DESC

Осталось только приделать, чтобы по этой конкретной сортировки выводили первые 5 строк.

IL
На сайте с 20.04.2007
Offline
435
#4
Amigo_9876:
чтобы по этой конкретной сортировки выводили первые 5 строк.
LIMIT 0, 5

добавить.

Однако, есть ощущение, что Вы не уловили, что вот так:

Amigo_9876:
начала шли объекты в порядке снижения по значению obj_top
Потом 5 объектов попадающих под критерий публикации от 1 до 2 лет назад,

без UNION одним запросом вряд ли удастся реализовать.

Условие выборки объектов от 1 до 2 лет назад.. применится ко всему запросу..

Аналогично - с сортировкой.. ко всей выборке

Amigo_9876
На сайте с 01.04.2009
Offline
305
#5
ivan-lev:
добавить.

Однако, есть ощущение, что Вы не уловили, что вот так:


без UNION одним запросом вряд ли удастся реализовать.

Условие выборки объектов от 1 до 2 лет назад.. применится ко всему запросу..
Аналогично - с сортировкой.. ко всей выборке

Та не, там же после запроса еще идет хитромудренный код.

Допустим под критерий всего селекта попало 62 строки, показывается по 10 строк на странице, итого 7 страниц.

И лимит 10, стоит именно в конце одного единственного запроса.

Вообще я думал, что работает так:

Сначала сортируется по первому критерию.

Для строк, значения которых одинаковые, идет сортировка по второму критерию, и т.д.

Т.е "от 1 до 2-х лет" я включил в сортировку, все работает. Но просто где-то таких строк выводится 3, а где-то 15, а мне нужно чтобы было максимум 5.

Но если это нельзя все в один запрос включить, то ну нахрен вообще. Я 100% не потяну какие-то юнионы изучать, а потом еще чужой некоментированный код править.

IL
На сайте с 20.04.2007
Offline
435
#6
Amigo_9876:
потом еще чужой некоментированный код править.

Так правьте свой, комментированный ))

Amigo_9876:
Я 100% не потяну какие-то юнионы изучать

На самом деле ничего сложного. Примерно так..

SELECT ... where первое условие ORDER BY ... LIMIT 0,5
UNION
(SELECT ... where второе условие ORDER BY ... LIMIT 0,5)
UNION
(SELECT ... where третье условие ORDER BY ... LIMIT 0,5)
Amigo_9876
На сайте с 01.04.2009
Offline
305
#7

ivan-lev, в php останется один запрос?

$query = "Select и поехали?"

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий