2016-11-14 51 views
1

我有一個規範化的SQL數據庫與幾個表格和HTML表格讀出數據。有一張表包含產品特徵,任何產品都可以具有一個或多個特徵。如何從sql-database讀出數據,當幾個標準匹配

主表:product_main pm, 具有特徵的表格:product_characteristics pc, product_id是外鍵。

id | product_id | product_name | characteristic 
1 | 27   | Product_C | characteristic5 
2 | 27   | Product_C | characteristic11 
3 | 27   | Product_C | characteristic3 
4 | 27   | Product_C | characteristic47 
5 | 27   | Product_C | characteristic34 
6 | 28   | Product_D | characteristic29 
7 | 28   | Product_D | characteristic63 
8 | 28   | Product_D | characteristic2 

現在,我想讀出所有符合所選條件的product_names。這工作得很好,當選擇只有一個特點:

SELECT pm.name 
FROM product_main pm, product_characteristics pc 
WHERE pc.characteristic = 'characteristic47' 
    AND pm.id = pc.product_id 

正確的結果是:Product_C。

如果一個以上的特徵被同時選擇,例如:

SELECT pm.name 
FROM product_main pm, product_characteristics pc 
WHERE pc.characteristic = 'characteristic47' 
    AND pc.characteristic = 'characteristic11' 
    AND pm.id = pc.product_id 

沒有結果,儘管Product_C兩個標準相匹配。 有人可以告訴我,我該如何解決這個問題?

回答

0

一種選擇使用條件聚集:

SELECT product_id, product_name 
FROM product_main 
GROUP BY product_id, product_name 
HAVING SUM(CASE WHEN characteristic = 'characteristic47' THEN 1 ELSE 0 END) > 0 AND 
     SUM(CASE WHEN characteristic = 'characteristic11' THEN 1 ELSE 0 END) > 0 

如果您也想保留product_main既具有匹配特徵的所有原始記錄,那麼你可以加入上表回原來的表:

SELECT t1.* 
FROM product_main t1 
INNER JOIN 
(
    SELECT product_id 
    FROM product_main 
    GROUP BY product_id 
    HAVING SUM(CASE WHEN characteristic = 'characteristic47' THEN 1 ELSE 0 END) > 0 AND 
      SUM(CASE WHEN characteristic = 'characteristic11' THEN 1 ELSE 0 END) > 0 
) t2 
    ON t1.product_id = t2.product_id 
0

pc.characteristic不能在同一時間都characteristic47characteristic11,但它可能是(characteristic47 OR characteristic11

所以修改查詢,像這樣

SELECT pm.name 
FROM product_main pm, product_characteristics pc 
WHERE (pc.characteristic = 'characteristic47' OR 
     pc.characteristic = 'characteristic11') 
    AND pm.id = pc.product_id 

您也前人的精力使用JOIN的,像這樣

SELECT pm.name 
FROM product_main pm 
JOIN product_characteristics pc ON pm.id = pc.product_id 
WHERE (pc.characteristic = 'characteristic47' OR 
     pc.characteristic = 'characteristic11')