1

我正在使用MySQL 5.0.88/Coldfusion8并且我有一个包含基于条形码/EAN 的产品的表。

所以一个大小为 123 的产品在S,M,L,XL表中会有 4 条记录

 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并且仅style在每个底层证券ean的数量 > 0 时才包括在内?如果是这样,谢谢指点!

编辑:
这是我正在测试的完整查询:

   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  )

这行得通。

4

3 回答 3

1

您可以使用子查询上的连接来完成此操作。基本上,加入可用数量为零的产品 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)
于 2012-08-27T20:10:46.010 回答
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 和尺寸总数之间的整数。

于 2012-08-27T20:14:47.093 回答
1

我认为你应该检查 MIN(a.qty):

select product from t group by product having min(qty)>0
于 2012-08-27T20:14:50.763 回答