2016-11-14 48 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')