2012-06-15 117 views
1

pro_id | Category
--------+---------
  25   | electronics
  27   | Electrical
  25   | household
  27   | electronics
  25   | industrial
SQL按类别筛选

以上是我的数据库表。我想按类别过滤结果。如果“electronics”是选定的类别,则结果应该包括产品ID 25和27.这很容易。但我想过滤多个类别。例如,如果我选择“电子”与“家用”,结果应该是唯一的产品编号25

+2

_you_你应该怎么做?你可能会发现你的答案质量更高,如果你能够证明你已经[为自己尝试过某种东西](http://mattgemmell.com/2008/12/08/what),人们更愿意帮助你-你有没有尝试过/)。 – Ben

+1

如果你想猜怎么做,你会猜测什么? – ean5533

回答

2

见这里的例子:http://sqlfiddle.com/#!2/09028/7

加入你的表本身pro_id,然后按类别过滤器来选择所有产品有两类:

SELECT prod1.pro_id 
FROM  prod AS prod1 
INNER JOIN prod AS prod2 ON prod1.pro_id = prod2.pro_id 
WHERE prod1.Category = 'electronics' 
    AND prod2.Category = 'household'; 

选择具有所有产品的至少一个类别:

SELECT prod.pro_id 
FROM prod 
WHERE prod.Category = 'electronics' 
    OR prod.Category = 'household' 
GROUP BY prod.pro_id; 
+0

为什么加入?为什么不选择prod where prod.Category ='electronics'OR prod.Category ='household'?' –

+1

这是必须的,因为否则pro_id = 27也会被选中,它只有两个所需的类别之一。 – biziclop

+0

@ElVieejo:正确 - 目前还不清楚产品是否必须成为满足查询的一部分。 –

0

不,它不应该,因为你有含多处e共享相同类别名称的ID。唯一的办法是获得你想要的东西,就是有另外一个领域能够唯一地识别每一条记录,否则你就会因为重复数据而手忙脚乱。

+0

假设它已经是'product_categories'表:)当然,不同的类别名称应该放在一个单独的表中。 – biziclop

1

如果你想只匹配两个标准的产品,你需要一个HAVING子句...

SELECT 
     p.pro_id 
    FROM  
     prod p 
    where 
     p.category in ('electronics', 'household') 
    having 
     count(*) = 2 

这样做的好处是,如果你想3个或多个类别,所有你需要做的就是将它们添加到“IN”子句中并将计数更改为3,4或其他值...

+0

谢谢DRapp ..我试过这个,它也能正常工作.. – Oogway