LINUX.ORG.RU

Помогите составить SQL запрос по приведенному алгоритму (видимо вложенные SELECT'ы)


0

0

Нужно вывести товары (название, производитель, кол-во, цена)
со всех партнерских складов. Сейчас это делается вот так:

SELECT * FROM store_products AS StoreProduct 
	LEFT JOIN producers AS Producer ON (StoreProduct.producer_id = Producer.id) 
	LEFT JOIN curriencies AS Curriency ON (StoreProduct.curriency_id = Curriency.id) 
	ORDER BY StoreProduct.title ASC LIMIT 20

Все замечательно работает. Но есть одно неудобство. Если один и 
тот же товар, допустим "Медведь плюшевый", есть на 3-х партнерских
складах, но нет на 4-м и 5-м складе - то получается такой вывод
(колонок уйма, оставил только нужные для примера).

Медведь плюшевый | Фабрика N1 | 231 шт | 2 руб
Медведь плюшевый | Фабрика N1 | 152 шт | 7 руб
Медведь плюшевый | Фабрика N1 | 23 шт  | 3 руб
Медведь плюшевый | Фабрика N1 | заказ  | 4 руб
Медведь плюшевый | Фабрика N1 | заказ  | 6 руб

Подскажите как составить запрос таким образом, чтобы если 
товар есть хотябы на одном складе, строки с нулевым кол-вом 
на других скаладах не выводилась. Т.е. чтобы было вот так

Медведь плюшевый | Фабрика N1 | 231 шт | 2 руб
Медведь плюшевый | Фабрика N1 | 152 шт | 7 руб
Медведь плюшевый | Фабрика N1 | 23  шт | 3 руб

Но это только для тех позиций которые хотя бы в одном экземляре есть
на других складах. Если на всех складах остатки 0 - показывать одну
строку с ценой на допустим складе N1.

Чтобы выводились те у которых поле на складе больше нуля, понятно -
 нужно дописать:

WHERE (`StoreProduct`.`in_stock` > 0)

Дальше вот сложно, логика такая:
1) Если у всех медведей кол-во 0, то показать только того 
медведя который с первого склада.
2) Если не у всех медведей кол-во 0 - показать только их 
(неважно с какого они склада).

Вот сформулированная логика

1) Ищем группу товаров с одинаковым названием (допустим медведи)
2) Смотрим на эту группу. Если у всех в группе кол-во = 0 то
[показать медведя с первого склада] иначе 
[показать всех медведей у которых кол-во > 0]

Подскажите как можно написать такой вопрос.

Ответ на: комментарий от phasma

вообщем для MySQL я ничего умнее хранимых функций или обработки в приложении пока не придумал :)

phasma ★☆
()

SELECT * FROM store_products AS StoreProduct 
	LEFT JOIN producers AS Producer ON (StoreProduct.producer_id = Producer.id) 
	LEFT JOIN curriencies AS Curriency ON (StoreProduct.curriency_id = Curriency.id) 
        where StoreProduct.in_stock > 0
union all
SELECT distinct * FROM store_products AS StoreProduct 
	LEFT JOIN producers AS Producer ON (StoreProduct.producer_id = Producer.id) 
	LEFT JOIN curriencies AS Curriency ON (StoreProduct.curriency_id = Curriency.id) 
        where StoreProduct.in_stock = 0

borisych ★★★★★
()
Ответ на: комментарий от borisych

> union all

оно только выведет все результаты, проще where StoreProduct.in_stock >= 0

phasma ★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.