Как сделать запрос на выборку по связанным данным по строгому параметру

Суть в чём, допустим есть таблица 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 шт):

Автор решения: Alex R.

Необходимо использовать группировку и групповые функции

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 содержит перечень продуктов через запятую

→ Ссылка
Автор решения: teran

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
→ Ссылка