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


Amigo_9876
332

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

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

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


Aisamiery

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

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

Объекты (строки) опубликованные в промежуток 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


ivan-lev

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

UNION в помощь..


Amigo_9876

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

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

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

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


ivan-lev

Amigo_9876:
чтобы по этой конкретной сортировки выводили первые 5 строк.
LIMIT 0, 5

добавить.

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

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

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

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

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


Amigo_9876

ivan-lev:
добавить.

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

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

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

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

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

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

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

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

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

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

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

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


ivan-lev

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *