Сложный MySQL запрос с группировкой и сортировкой с учетом NULL

vlad_ir

Постоялец
Регистрация
13 Июл 2007
Сообщения
54
Реакции
18
Добрый день. Помогите, пожалуйста, в решение следующей проблемы:
1. Есть две таблицы products (товары) с полями id и name и таблица properties с полями id, product_id, kolvo
2. Понятно, что множество значений таблицы properties соответствует единственному значению в таблице products
3. Поле kolvo таблицы properties по умолчанию имеет значение NULL, также в нем хранится количество товара на складе.
4. Есть запрос:
Код:
SELECT * FROM products p ORDER BY(SELECT pv.kolvo FROM  properties pv WHERE p.id=pv.product_id ORDER BY-pv.kolvo DESC LIMIT1)
В результате получаем товары, которые идут от меньшего к большему, но товары с количеством NULL выводятся вначале, а они должны выводиться в конце (т.е. NULL - это неограниченное количество товара). Причем, есть нюанс: если у одного и того же товара кроме NULL есть еще значения в столбце kolvo таблицы properties, то сортировка должна быть по этим значениям (берется минимальное), а не по NULL

Если группировка не нужна и выбирать только из таблицы свойств, то все просто:
Код:
SELECT * FROM  properties ORDER BY -kolvo DESC
А вот как добиться такого результата с группировкой не пойму. Помогите, пожалуйста.
 
покажите пример в виде таблиц, который показывал ситуацию с нулл и не нулл
можно попробовать такую конструкцию
Код:
ORDER BY ISNULL(field), field ASC
либо
Код:
ORDER BY COALESCE(field, 999999999) ASC, field1 DESC
ещё к сведению
Для просмотра ссылки Войди или Зарегистрируйся
 
Попробуй с таким подзапросом:
PHP:
SELECT IFNULL(MAX(pv.kolvo), 0) FROM  properties pv WHERE p.id=pv.product_id
- выбирает максимальный для продукта kolvo и если даже он равен NULL, выводит вместо него 0
 
Попробуй с таким подзапросом:
PHP:
SELECT IFNULL(MAX(pv.kolvo), 0) FROM  properties pv WHERE p.id=pv.product_id
- выбирает максимальный для продукта kolvo и если даже он равен NULL, выводит вместо него 0
ТС нужно чтоб в конце значения с нуллом были, поэтому вместе 0 скорее всего должно быть достаточно большое число, чтоб результаты потом использовать и "правильно" отсортировать
 
покажите пример в виде таблиц, который показывал ситуацию с нулл и не нулл
можно попробовать такую конструкцию
Код:
ORDER BY ISNULL(field), field ASC
либо
Код:
ORDER BY COALESCE(field, 999999999) ASC, field1 DESC
ещё к сведению
Для просмотра ссылки Войди или Зарегистрируйся

Эти конструкции мне прекрасно известны, но они, к сожалению, не работают. Здесь нужен какой-то хитрый вложенный запрос, а вот с этим у меня проблемы.

ТС нужно чтоб в конце значения с нуллом были, поэтому вместе 0 скорее всего должно быть достаточно большое число, чтоб результаты потом использовать и "правильно" отсортировать
Огромное спасибо, latteo! Ваш запрос подходит. Только, как заметил Шумадан, вместо 0 я подставил огромное значение.
 
Последнее редактирование модератором:
order by ... (CASE WHEN some IS NULL THEN 0 ELSE 1 END) DESC ..
 
Назад
Сверху