Как сделать запрос на выборку по связанным данным по строгому параметру
Суть в чём, допустим есть таблица color в которой набор полей id, product_id, quantity и таблица product с полями id, sku, нужно выбрать все товары в которых quantity > 0 на каждый цвет. Как в таком случае поступить, ничего в голову не может придти?
Даю больше информации:
color
|id|product_id|quantity|
|1 |1 |0 |
|2 |1 |1 |
|3 |2 |1 |
|4 |3 |1 |
|5 |3 |1 |
нужно чтоб в итоге показало только product_id=2,3 так как они имеют коли чисто, в product_id=1 есть поле з quantity=0
Ответы (2 шт):
Необходимо использовать группировку и групповые функции
select
group_concat(p.sku separator ', ') skus, c.id
from product p,
color c
where c.product_id = p.id
and c.quantity > 0
group by c.id
Если в таблице все таки есть поле color нужно группировать по нему. Поле skus содержит перечень продуктов через запятую
distinct выборку сделайте и все
SELECT DISTINCT p.id, p.sku
FROM product AS p
INNER JOIN color AS c ON c.product_id = p.id and c.quantity > 0
или подзапросом
SELECT p.id, p.sku
FROM products as p
WHERE id IN (select distinct product_id from color where quantity > 0)
или смешайте оба подхода - приджойньте подзапрос (возможно это будет наиболее быстрый вариант, кстати)
SELECT p.id, p.sku
FROM products as p
INNER JOIN (
SELECT distinct product_id FROM color WHERE quantity > 0
) AS x ON x.product_id = p.id
можно применить группировку, но это избыточный инструмент для данной задачи/
апд. чтобы оставить в выборке только те, у которых нет нулевых цветов, то очевидные пути будут
seleсе distict product_id
from color
where quantity > 0
and product_id not in (
select distinct product_id
from color
where qunatity = 0 )
либо с группировкой с подсчетом нулевых строк
select product_id
from colors
group by product_id
having sum(if(quantity = 0, 1, 0)) = 0
либо самоджойн ненулевых с нулевыми.
select distinct c.product_id
from colors as c
left join colors as c2 on (c2.product_id = c.product_id and c2.quantity = 0)
where c.quantity > 0
and c2.product_id is null