Всем привет!
Совсем туплю, не знаю как сделать такую выборку единым запросом. Есть таблица с товарами, отдельно с их названиями (по языкам). В 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 каждого объединяемого запроса. И только вот последний вариант работает с учетом сортировки.