[英]How to select grouped records only if every record in a group meets a certain criteria in MySQL?
我正在使用MySQL 5.0.88/Coldfusion8
,我有一个包含基于条形码/ EAN的产品的表。
因此,尺寸为S,M,L,XL
的产品123将在表中具有四个记录
product size ean qty disregard_inventory
123 S 1111111111111 5 0
123 M 1111111111112 7 0
123 L 1111111111113 1 0
123 XL 1111111111114 2 0
现在我正在搜索这样的表:
SELECT count(a.id) AS total_records, a.disregard_inventory, a.qty
FROM artikelstammdaten a
...
GROUP BY a.style
HAVING sum(a.qty) != 0 OR (a.disregard_inventory = 1)
这可以正常工作,并选择所有未售罄的产品(所有eans的总和> 0)/始终可用
我现在想添加一个功能,因此用户可以搜索每种尺寸至少为1pc的产品。 在这种情况下,样式123
123 S 1
123 M 0
123 L 12
123 XL 9
由于size M
已售罄,因此不会包含在结果集中。
但是我无法让它发挥作用。 这就是我所拥有的(产生垃圾):
GROUP BY a.style
<cfif form.select_type EQ "running_sizes">
HAVING a.qty!= 0 OR ( a.disregard_inventory = 1 )
<cfelse>
HAVING sum(a.bestand) != 0 OR (a.disregard_inventory = 1)
</cfif>
问题 :
是否可以按style
分组,并且只有当每个底层ean
的数量> 0时才包含style
? 如果是这样,感谢指点!
编辑:
这是我的完整查询,我正在测试:
SELECT count(a.id) AS gesamt_datensaetze, a.nos, a.nos_anzeige, a.bestand, SUM(a.bestand>0) AS what
FROM artikelstammdaten a
WHERE a.aktiv = "ja"
AND a.firma LIKE "some_company"
// groups by seller_id, style
GROUP BY a.iln, a.artikelnummer
HAVING sum(a.bestand) != 0 OR (a.nos = "ja" AND a.nos_anzeige = "ja")
AND ( SUM(a.bestand > 0) = COUNT(*))
解:
部分模拟:
HAVING (( sum(a.bestand) != 0 ) OR (a.nos = "ja" AND a.nos_anzeige = "ja" ))
AND ( SUM(a.bestand > 0) = gesamt_datensaetze )
这有效。
您可以使用子查询上的连接来完成此操作。 基本上,加入可用数量为零的产品ID集合,然后仅返回没有匹配的结果。
SELECT count(a.id) AS total_records, a.disregard_inventory, a.qty
FROM artikelstammdaten a
LEFT JOIN (
SELECT DISTINCT id
FROM artikelstammdaten
WHERE qty = 0
) b
ON b.id = a.id
WHERE b.id IS NULL
...
GROUP BY a.style
HAVING sum(a.qty) != 0 OR (a.disregard_inventory = 1)
我建议以下查询:
SELECT COUNT(a.id) AS total_records, a.disregard_inventory, a.qty
FROM artikelstammdaten a
...
GROUP BY a.style
HAVING (SUM(a.qty) != 0 OR (a.disregard_inventory = 1))
AND (SUM(qty>0) = total_records)
我添加到查询中的最后一个条件只有在此产品的大小数( total_records
)等于此产品的可用大小数( SUM(qty>0)
)时才能返回样式。
qty>0
将返回0(当产品在给定大小时不可用时,或1(当它可用时)。因此SUM(qty>0)
将返回0到大小总数之间的整数。
我想你应该检查MIN(a.qty):
select product from t group by product having min(qty)>0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.