2012-08-27 40 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

相關問題