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

Тема в разделе "Базы данных", создана пользователем vlad_ir, 15 июн 2014.

Модераторы: latteo
  1. vlad_ir

    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
    А вот как добиться такого результата с группировкой не пойму. Помогите, пожалуйста.
     
    Шумадан нравится это.
  2. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.722
    Симпатии:
    2.097
    покажите пример в виде таблиц, который показывал ситуацию с нулл и не нулл
    можно попробовать такую конструкцию
    Код:
    ORDER BY ISNULL(field), field ASC
    либо
    Код:
    ORDER BY COALESCE(field, 999999999) ASC, field1 DESC
    ещё к сведению
    http://dev.mysql.com/doc/refman/5.0/en/problems-with-null.html
     
  3. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.401
    Симпатии:
    1.182
    Попробуй с таким подзапросом:
    PHP:
    SELECT IFNULL(MAX(pv.kolvo), 0FROM  properties pv WHERE p.id=pv.product_id
    - выбирает максимальный для продукта kolvo и если даже он равен NULL, выводит вместо него 0
     
    vlad_ir нравится это.
  4. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.722
    Симпатии:
    2.097
    ТС нужно чтоб в конце значения с нуллом были, поэтому вместе 0 скорее всего должно быть достаточно большое число, чтоб результаты потом использовать и "правильно" отсортировать
     
    vlad_ir нравится это.
  5. vlad_ir

    vlad_ir Постоялец

    Регистр.:
    13 июл 2007
    Сообщения:
    54
    Симпатии:
    18
    Эти конструкции мне прекрасно известны, но они, к сожалению, не работают. Здесь нужен какой-то хитрый вложенный запрос, а вот с этим у меня проблемы.

    Огромное спасибо, latteo! Ваш запрос подходит. Только, как заметил Шумадан, вместо 0 я подставил огромное значение.
     
    Последнее редактирование модератором: 15 июн 2014
    Шумадан нравится это.
  6. SteelRat

    SteelRat Постоялец

    Регистр.:
    12 апр 2007
    Сообщения:
    54
    Симпатии:
    7
    order by ... (CASE WHEN some IS NULL THEN 0 ELSE 1 END) DESC ..