在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