2014-02-08 103 views
1

在MySQL中我有3個表名爲「產品」,「PRODUCT_GROUP」和「PRODUCT_CATEGORY」MySQL查詢加盟值

產品可以通過「PRODUCT_GROUP」表中彼此相關。

產品可以通過「product_category」表格顯示在特定類別中。

我想要做的是從特定類別中檢索所有產品,這些產品要麼有價格,要麼包含一個或多個有價格的子產品。

這裏的表的一個示例:

product 
======= 
product_id  price 
1    10.00 
2    20.00 
3    0.00 
4    40.00 
5    50.00 
6    0.00 
7    0.00 
8    0.00 
9    0.00 
10    0.00 
11    1.99 

product_group 
============= 
product_id  child_product_id 
6    1 
6    2 
7    3 
7    4 
8    9 

product_category 
================ 
category_id  product_id 
1    5 
1    6 
1    7 
1    8 
1    10 
2    11 

這意味着產品1和2是產品的兒童6.產品3和4是產品的兒童7.產品9是產品8的子級。

產品5,6,7,8和10是在類別1

我要的是一個查詢返回所有產品類別1中,要麼有一個價格,或者包含具有一個或多個孩子一個價格。所以我期望得到產品5,6,7。儘管產品8和10都屬於第1類,但我不想要這些產品,因爲它們沒有價格,並且不包含有價格的兒童。

我可以使用內部和左連接的組合來發布我迄今爲止編寫的查詢,但我擔心它完全錯誤。

謝謝你的期待。

*編輯*

我發現我原來的查詢做的工作,我得到了數據在我的兩個列混合起來的。這裏是我的下面原始查詢:

SELECT p.product_id 
    FROM product p 
    JOIN product_category c 
    ON c.product_id = p.product_id 
    AND c.category_id = 1 
    LEFT 
    JOIN product_group g 
    ON p.product_id = g.product_id 
    LEFT 
    JOIN product AS p2 
    ON p2.product_id = g.child_product_id 
    AND p2.price > 0 
WHERE p.price > 0 OR p2.product_id IS NOT NULL 
GROUP BY p.product_id 
+2

我會說繼續併發布你寫的查詢。誰在乎它是否錯誤?這就是你來這裏的原因,對吧? – Aaron

回答

1

我會做這樣的事情:

SELECT p.product_id 
    FROM product p 
    JOIN product_category c 
    ON c.product_id = p.product_id 
    AND c.category_id = 1 
    LEFT 
    JOIN (SELECT g.product_id 
      FROM product_group g 
      JOIN product h 
      ON h.product_id = g.child_product_id 
      AND h.price > 0.00 
      GROUP BY g.product_id 
     ) r 
    ON r.product_id = p.product_id 
WHERE p.price > 0 
    OR r.product_id IS NOT NULL 

注:

聯接到PRODUCT_CATEGORY得到我們的限制,該產品必須在類別1中。

內聯視圖(派生表別名爲r)獲取我們的列表「paren t「product_id,其具有有價格的child_product_id。

我們做了一個OUTER連接,所以我們仍然獲得了類別1中的所有行,我們只是做一個匹配。

在WHERE子句中,我們過濾掉了行,並且只保留那些有價格的產品,或者與內嵌視圖相匹配的行。

這只是一種方法,有幾種方法可以獲得等效的結果集。

這假定product_id在產品表中是唯一的。

這也假定(category_id,product_id)元組在product_category表中是唯一的,也就是說,不會有重複的,例如, (1,5),(1,5)。如果該假設無效,那麼我們可能希望在查詢末尾添加一個GROUP BY p.product_id,以獲得一個清晰的列表。

此外,這隻看直接的孩子;它並不期望看到孫子(孩子的孩子)是否有價格。

+0

您對product_id和元組唯一的假設都是正確的。我會稍後嘗試查詢,並告訴你它是否有效 - 謝謝 – MrCarrot

+0

@MrCarrot:你可以在內聯視圖中運行查詢別名爲r,以驗證它是否返回一個正確的列表(product_id有一個子產品,有價格。)您也可以修改WHERE子句來檢查產品價格,並對其進行修改,以便僅檢查來自r的匹配行。 – spencer7593

+0

謝謝@ spencer7593,我將把你的標記爲正確的答案。然而,我發現我的原始查詢確實有效(我編輯了我的問題以包含它,並且我重命名了表別名以使其與您的相比) - 我導入後在列中混合了數據,因此我認爲它是失敗。我已經解釋了你的查詢,它有5個步驟。我的查詢有4個步驟,但由於GROUP BY而使用文件夾。我不確定哪個效率最高,但我現在有幾個工作選項。我很想聽聽你對兩者進行比較的看法。謝謝! – MrCarrot