iamjack
@iamjack
PHP, JS developer

Как выполнить сортировку товаров сперва по некоторому критерию, а затем по наличию?

Всем привет!

Совсем туплю, не знаю как сделать такую выборку единым запросом. Есть таблица с товарами, отдельно с их названиями (по языкам). В 1й таблице есть колонка общего остатка товара. И вот допустим, мне нужно получить товары, но так, чтобы все с нулевым остатком ушли вниз запроса. То есть получается будет как бы две части в одном результате - 1я в наличии и 2я по нулям. И вот каждая из этих 2х частей должна быть отсортирована, например, по названию товара.
Допустим всего товаров 30, в наличии 20 из них. Тогда если в запросе у нас стоит LIMIT 21, то должны вывестись все 20 что в наличии (по алфавиту), а затем 1 из тех, что "не в наличии" и при этом он должен быть по алфавиту первым.

Как такое можно сделать? Простым order by не отделаться =)

------- Ниже неверный подход! См. решение от DELETEDDELETEDDELETEDDELETEDDE DELETEDDELETEDDELET... --------
----- UPD -------

Вот такой вариант набросал:
(SELECT 
    p1.product_id, p1.quantity, pd1.name
FROM
    oc_product p1
        LEFT JOIN
    oc_product_description pd1 ON p1.product_id = pd1.product_id
WHERE
    p1.quantity > 0
ORDER BY pd1.name) UNION (SELECT 
    p2.product_id, p2.quantity, pd2.name
FROM
    oc_product p2
        LEFT JOIN
    oc_product_description pd2 ON p2.product_id = pd2.product_id
WHERE
    p2.quantity = 0
ORDER BY pd2.name ASC)


Как я понимаю, это единственный вариант - разбивать на 2 отдельных запроса и юнионом их сливать в кучу?

*Тут правда еще не работает сортировка по названию, но счас еще гляну что к чему.

----- UPD2 ------
Разобрался с сортировкой и правильным видом запроса.Не разобрался в том, почему именно так работает, а вариант из 1го UPD выше нет.
Так корректно:
select * FROM (SELECT 
    p1.product_id, p1.quantity, pd1.name
FROM
    oc_product p1
        LEFT JOIN
    oc_product_description pd1 ON p1.product_id = pd1.product_id
WHERE
    p1.quantity > 0
order by pd1.name) as pp1 UNION (SELECT 
    p2.product_id, p2.quantity, pd2.name
FROM
    oc_product p2
        LEFT JOIN
    oc_product_description pd2 ON p2.product_id = pd2.product_id
WHERE
    p2.quantity = 0
ORDER BY pd2.name)


Не знаю почему, но в первом варианте MySQL игнорирует ORDER каждого объединяемого запроса. И только вот последний вариант работает с учетом сортировки.
  • Вопрос задан
  • 356 просмотров
Пригласить эксперта
Ответы на вопрос 1
thewind
@thewind
php программист, front / backend developer
Order by nalichie DESC, name ASC
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы