SQL-如何选择具有给定选项和值集的示例

时间:2014-05-25 18:33:19

标签: sql select


我想获得具有相同值的相同选项的示例数量 这是表格 table:ExampleOption

--------------
| id | nom   |
--------------
| 1  | size  |
--------------
| 2  | color |
--------------


表:值

------------------------------------------
| Example_id | ExampleOption_id | value  |
------------------------------------------
| 1          |       1          | XL     |
------------------------------------------
| 1          |       2          | black  |
------------------------------------------
| 2          |       1          |  L     |
------------------------------------------
| 2          |       2          | red    |
------------------------------------------
| 3          |       1          | XL     |
------------------------------------------
| 3          |       2          | red    |
------------------------------------------


表:示例

---------------------------------
|     id     | product_id       |
--------------------------------- 
| 1          |        1         |
---------------------------------
| 2          |        1         |
---------------------------------
| 3          |       2          |
---------------------------------


我试过这个

SELECT COUNT(DISTINCT Example_id) FROM Value WHERE 
Example_id IN(SELECT id FROM Example WHERE product_id=1)
AND ( ExampleOption_id = 1 AND value = 'XL' OR ExampleOption_id = 2 AND value='red')


此查询应该返回2,但它返回3,这与预期的错误

2 个答案:

答案 0 :(得分:0)

如果我了解您的问题,我相信您的OR条件中的WHERE声明会导致错误的结果。尝试添加一些括号:

SELECT COUNT(DISTINCT exemplaire_id) 
FROM valeur 
WHERE exemplaire_id IN (
    SELECT id 
    FROM produit 
    WHERE produit_id=?) 
    AND ((option_produit_id = 1 AND valeur = 'XL') 
         OR (option_produit_id = 2 AND valeur='red'))

答案 1 :(得分:0)

我想,你正在寻找类似这样的东西(未经测试的代码!)

SELECT
  COUNT(DISTINCT Example_id)
FROM
  Value V
WHERE
  EXISTS (SELECT 1 FROM Example E WHERE V.Example_id = E.id AND E.product_id = 1)
  AND (
    (V.ExampleOption_id = 1 AND V.value = 'XL')
    OR (V.ExampleOption_id = 2 AND V.value = 'red')
  )
GROUP BY
  V.Example_id
HAVING
  COUNT(1) = 2

对结果进行分组,然后过滤到包含所有两条记录的所有组。 (DISTINCT可能是不必要的)