Вопрос по запросу в mysql

savage
На сайте с 10.01.2007
Offline
224
510

Люди, хелп! Вроде на первый взгляд простая задача, но чего-то никак не получается. Надо организовать сортировку товара по цене, при этом чтобы товары с изображениями выдавались вначале, т.е. типа ORDER BY одновременно по 2-м полям. Если сортировать так: ORDER BY img DESC, price DESC - изображения впереди оказываются, но не отсортированные по цене. Пробовал через UNION

(SELECT * FROM prod WHERE (count>0 and price>0 and img<>'') ORDER BY price DESC) - так сортирует по цене

(SELECT * FROM prod WHERE (count>0 and price>0 and img<>'') ORDER BY price DESC) UNION (SELECT * FROM prod WHERE (count>0 and price>0 and img='')) LIMIT 0,12 - а так уже нет.

Неужели это можно сделать только используя временную таблицу?

Купить / продать сайт ( https://www.telderi.ru/?pid=ca1f70 ) | Недорогой и надежный хостинг ( https://www.get-host.ru )
[Удален]
#1

ORDER BY price DESC , img DESC

Sentoro
На сайте с 18.03.2007
Offline
149
#2

Кароче всё перетёр прошлое, вот:

ORDER BY `таблица`.`поле` ASC, `таблица`.`поле` DESC

Продается СДЛ на тему инвестирования (http://www.telderi.ru/ru/viewsite/903457)
savage
На сайте с 10.01.2007
Offline
224
#3

MOP1, в таком варианте сортирует только по цене, а на картинки забивает

Sentoro:
ORDER BY `таблица`.`поле` ASC, `таблица`.`поле` DESC

ORDER BY img DESC, price DESC - изображения впереди оказываются, но не отсортированные по цене.

ORDER BY img, price DESC - по цене сортирует, но изображения сзади.

А разница какая, с написанным выше, если таблица одна?

Dreammaker
На сайте с 20.04.2006
Offline
569
#4

SELECT * FROM prod WHERE count>0 and price>0 ORDER BY img='' ASC, price DESC LIMIT 0,12

Попробуйте так.

DyaDya
На сайте с 11.04.2007
Offline
147
#5

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

SELECT price, STRCMP('', img) AS have_image FROM prod WHERE price>0 ORDER BY have_image ASC, price DESC;

Вся фишка вот в этом: STRCMP('', img) AS have_image, а потом по have_image можно как нужно сортировать.

STRCMP('', img) должно для пустого поля вернуть 1, а для позиции с картинкой должно вернуть -1. Вот по этому значению параметра и сортируем.

Если по ASC, то вверху будут те позиции у которых есть картинки. Они будут сортироваться по цене. Потом пойдут те у которых нет картинок и тоже будут сортироваться по цене.

Вместо STRCMP('', img) можно и другую какунидь функцию похожую, которая возвращает true или false в случае совпадения и не совпадения значений '' (пустая строка) с img

А как сортировать в ORDER BY это уж как пожелаете.

Вроде правильно всё описал. Удачи.

---

Нашёл похожую функцию, которую тоже можно применить IF(img<>'', 1, 0) - должна возвращать 1, если картинка есть, и 0 если картинки нет. Нужно проверить как будет реагировать на значение NULL в поле img

Выбирайте качественный хостинг (http://vashmaster.ru/informaciya/o_poleznyh_programmah/news83.php) и продвигайте сайты в СЕОПУЛЬТ (http://seopult.ru/ref.php?ref=72b5ed9561fe66a1). А на «SAPE» я в обиде :) Не упрекайте за очепятки, пишу вслепую (http://ergosolo.ru/) и также делаю сайты (http://www.vashmaster.ru/) ;)
savage
На сайте с 10.01.2007
Offline
224
#6
Dreammaker:
SELECT * FROM prod WHERE count>0 and price>0 ORDER BY img='' ASC, price DESC LIMIT 0,12

Попробуйте так.

Работает. :) Почему, не могу понять, и как вообще воспринимать эту конструкцию ORDER BY img='', но работает!

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

SELECT price, STRCMP('', img) AS have_image FROM prod WHERE price>0 ORDER BY have_image ASC, price DESC;

Вся фишка вот в этом: STRCMP('', img) AS have_image, а потом по have_image можно как нужно сортировать.

STRCMP('', img) должно для пустого поля вернуть 1, а для позиции с картинкой должно вернуть -1. Вот по этому значению параметра и сортируем.
Если по ASC, то вверху будут те позиции у которых есть картинки. Они будут сортироваться по цене. Потом пойдут те у которых нет картинок и тоже будут сортироваться по цене.

Вместо STRCMP('', img) можно и другую какунидь функцию похожую, которая возвращает true или false в случае совпадения и не совпадения значений '' (пустая строка) с img

А как сортировать в ORDER BY это уж как пожелаете.

Вроде правильно всё описал. Удачи.

---
Нашёл похожую функцию, которую тоже можно применить IF(img<>'', 1, 0) - должна возвращать 1, если картинка есть, и 0 если картинки нет. Нужно проверить как будет реагировать на значение NULL в поле img

А это вообще очень эллегантное решение и красивое решение! Dreammaker и DyaDya большое спасибо!

Dreammaker
На сайте с 20.04.2006
Offline
569
#7
savage:
и как вообще воспринимать эту конструкцию ORDER BY img=''

ну как: поставить все строки, которые содержат опредёленное значение в конец :)

update: собственно, мы сортируем по очереди, сначала первое правило, которое сортирует по содержание/отсуствию определённого значения, а затем уже по второму - по цене.

savage
На сайте с 10.01.2007
Offline
224
#8
Dreammaker:
ну как: поставить все строки, которые содержат опредёленное значение в конец :)
update: собственно, мы сортируем по очереди, сначала первое правило, которое сортирует по содержание/отсуствию определённого значения, а затем уже по второму - по цене.

Спасибо за комментарий! Первый раз такое вижу в ORDER BY :)

Dreammaker
На сайте с 20.04.2006
Offline
569
#9

Ещё может быть полезна вот такая конструкция:

ORDER BY field IN (1, 2) DESC

Если мы хотим например, поднять какие-то товары вверх. Или же какие-то категории объявлений в доске объявлений являются привелегированными и должны показываться первыми.

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