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

Amigo_9876
На сайте с 01.04.2009
Offline
250
324

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

$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 лет назад, с сортировкой по этой самой дате.

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

Автоматическая публикация в ВК, FB, Twit, Instgm (http://bit.do/fcdAH) - от 250 руб/месяц. Лучший украинский хостинг (http://bit.do/fcdAQ) Проверяю на индекс (http://bit.do/fcdBe) и тут же индексирую (http://bit.do/fcdBj)
Aisamiery
На сайте с 12.04.2015
Offline
206
#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
412
#2
Amigo_9876:
То есть хочу, чтобы сначала шли объекты в порядке снижения по значению obj_top
Потом 5 объектов попадающих под критерий публикации от 1 до 2 лет назад, с сортировкой по этой самой дате.

UNION в помощь..

Amigo_9876
На сайте с 01.04.2009
Offline
250
#3

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

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

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

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

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

добавить.

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

IL
На сайте с 20.04.2007
Offline
412
#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
250
#7

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

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

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