2012-08-27 37 views
1

我使用的是MySQL 5.0.88/Coldfusion8,我有一个包含基于条形码/ EAN的产品的表格。如何仅在组中的每条记录符合MySQL中的某个条件时才选择分组记录?

所以在尺寸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) 

该工程确定和选择所有产品哪些没有卖完(总和> 0在所有的东西)/总是可用

我现在想添加一个功能因此用户可以搜索产品,每个尺寸至少有1个尺寸为。在这种情况下,风格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(*)) 

解决方案:
Partenthesis mising:

HAVING ((sum(a.bestand) != 0) OR (a.nos = "ja" AND a.nos_anzeige = "ja")) 
AND (SUM(a.bestand > 0) = gesamt_datensaetze ) 

这工作。

回答

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和大小的总数之间的一个整数。

+0

没问题。这听起来也不错。尝试 – frequent

+0

@frequent我的查询是否能解决问题? – Jocelyn

+0

仍然想知道该怎么做的结果。给我一分钟 – frequent

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) 
+0

啊。棘手。尝试这一点。 – frequent

+0

hm。我必须再试一次。结果不正确,27386执行时间:-) – frequent

1

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

select product from t group by product having min(qty)>0 
+0

也试过。也没有工作。再玩一下。 – frequent

相关问题