2012-05-06 2 views
0

Я перечисляю свойства продукта в таблице MySQL, где каждая строка содержит идентификатор продукта prod и идентификатор объекта prop. Если у продукта есть три свойства, это приводит к трем строкам для этого продукта. Пример таблицы:Как найти все продукты с некоторыми свойствами?

prod | prop 
-----+----- 
1 | 1 
2 | 1 
2 | 2 
2 | 3 
3 | 2 
3 | 4 

Как найти, какие продукты имеют свойства # 1 и # 2 (продукт # 2)?

Единственный способ, о котором я могу думать, - это одно из элементов выбора и внутреннего соединения на каждое свойство, но я думаю, что это было бы очень неэффективно. Это функция поиска для веб-сайта и должна работать для 10k строк в таблице и 10 запрошенных свойств.

ответ

2
SELECT prod 
    FROM tbl 
    WHERE prop IN (1, 2) 
GROUP BY prod 
    HAVING COUNT(*) = 2 

И если будет всегда 2 свойства, чтобы найти - то INNER JOIN будет немного более эффективным:

SELECT t1.p 
     FROM tbl t1 
INNER JOIN tbl.t2 ON t2.prod = t1.prod 
       AND t2.prop = 2 
    WHERE t1.prop = 1 

Рекомендованный индекс для этого запроса, чтобы быть эффективным, насколько это возможно, представляет собой соединение 1 (prop, prod)

+0

спасибо! – Andreas

+0

Является ли '(prop, prod)' рекомендуемым индексом, даже если я использую альтернативу группировки? – Andreas

+0

@Andreas: нет, тогда нужно использовать только один столб 'prod' – zerkms

Смежные вопросы