SQL Query - поставить несколько условий на один продукт - PullRequest
0 голосов
/ 19 октября 2011

Пожалуйста, помогите мне с этим: У меня есть таблица, как:

id_feature  id_product  id_feature_value
1              1           50
2              1           54
5              1           67

И я хочу выбрать из этой таблицы вот так:

выберите количество (id_product) из table, где (id_feature = 1 И id_feature_value = 50) И (id_feature = 2 И id_feature_value = 54) И (id_feature = 5 И id_feature_value = 67)

мой запрос должен соответствовать условиям. Как , имеющий количество (условие) = 3

Я не знаю, как это написать!

Пожалуйста, помогите мне! и прости мой английский!

    SELECT count( pf.id_product ) AS nr_product, value, fv.id_feature_value, filter
FROM `nk_category_features` cat_f
INNER JOIN `nk_feature_value` fv ON fv.id_feature = '11'
AND fv.value IS NOT NULL
INNER JOIN `nk_product_features` pf ON pf.id_feature = '11'
AND pf.id_feature_value = fv.id_feature_value
INNER JOIN `nk_product` p ON p.id_product = pf.id_product
AND p.product_active = '1'
INNER JOIN `nk_product_features` pf1 ON ( pf1.id_feature = '14'
AND (
pf1.id_feature_value = '21'
) )
WHERE cat_f.id_feature = '11'
AND filter >0
GROUP BY pf.id_feature, pf.id_product
ORDER BY abs( fv.value ) ASC

это мой запрос, который я использовал сейчас, но мне не нравится внутреннее соединение по ширине решения, внутреннее соединение по той же таблице

1 Ответ

4 голосов
/ 19 октября 2011

попробуйте это:

select id_product,count(*)
from table
where (id_feature = 1 AND id_feature_value = 50) 
   OR (id_feature = 2 AND id_feature_value = 54) 
   OR (id_feature = 5 AND id_feature_value = 67)
group by id_product
having count(*) = 3

Чтобы получить только общее количество продуктов, соответствующих пункту where

select count(*)
from 
  ( select id_product
    from table
    where (id_feature = 1 AND id_feature_value = 50) 
       OR (id_feature = 2 AND id_feature_value = 54) 
       OR (id_feature = 5 AND id_feature_value = 67)
    group by id_product
    having count(*) = 3
  ) tmp
...