在MySQL中,如何仅当组中的每个记录都满足特定条件时才选择分组记录?
我使用的是在MySQL中,如何仅当组中的每个记录都满足特定条件时才选择分组记录?,mysql,select,group-by,having,Mysql,Select,Group By,Having,我使用的是MySQL 5.0.88/Coldfusion8,我有一个表,其中包含基于条形码/EANs的产品 因此,尺寸为S、M、L、XL的产品123在表中有四条记录 product size ean qty disregard_inventory 123 S 1111111111111 5 0 123 M 1111111111112 7 0 123 L 11111111111
MySQL 5.0.88/Coldfusion8
,我有一个表,其中包含基于条形码/EANs的产品
因此,尺寸为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)
此操作正常,并选择所有未售完的产品(所有EAN的总和均大于0)/始终可用
我现在想添加一个功能,这样用户就可以搜索每种尺寸至少有1便士的产品。在本例中,样式123
123 S 1
123 M 0
123 L 12
123 XL 9
由于尺寸M
已售完,因此不会包含在结果集中
但是我不能让它工作。这就是我所拥有的(制造垃圾):
解决方案:合作伙伴:
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(quaty>0)
)时,才允许返回样式。qty>0
将返回0(当产品在给定尺寸下不可用时)或1(当产品可用时)。因此SUM(qty>0)
将返回一个介于0和尺寸总数之间的整数。我认为您应该检查MIN(a.qty):
嗯。我必须再试一次。结果不正确,执行时间为27386次:-)仍然不知道如何处理结果。给我一段小调。我在所有的EAN中都得到了很多
quantity=0
的结果。完整的查询是什么?您用什么替换…
?(就在groupby
之前)我已经从查询中删除了所有其他内容。在上面粘贴。问题是(我相信),SUM(a.qty>0)
不是用qty>0得到所有大小,而是在所有大小之间求和,因此2,0,0,0
将给出SUM(a.qty>0)=2
(2+0+0+0)vs.应该是1否,正如我在回答中解释的:SUM(a.qty>0)
将转换为:(2>0)+(0>0)+(0>0)+(0>0),结果是1,而这里的总记录等于4。也不起作用。再玩一会儿。
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)
select product from t group by product having min(qty)>0