2015-04-03 3 views
-1

У меня проблема с извлечением данных из таблицы, где каждый элемент должен соответствовать требованиям фильтра из другой таблицы, где существуют отношения между product_id, feature_category_id и feature_option_id.SQL Получить все отфильтрованные элементы

Например. Ниже приведены примеры вставок из этой справочной таблицы:

id = 1 
product_id = 10 
feature_category_id = 100 - it's name of "feature category" eg. dimensions, weight etc. 
feature_option_id = 1001 - it's product value of feature category eg. this product with id 10 have dimensions of 100x100 and it's id in another table is 1001 so it's that value. 

Теперь мне нужно получить все продукты, соответствующие этим требованиям. Например. Я выбираю из формы поиска, давая мне все продукты с размерами 100x100 и весом 1 кг, поэтому запрос должен что-то сделать, чтобы проверить эти данные в таблице.

Я пробовал что-то, но он работает только в том случае, если есть 1 product.features.feature_category_id. Если где равно 2 или более, где кластеры этого типа содержат 0 возвращенных строк.

select distinct 
    "products".*, "product_categories.*" 
from 
    "products" 
inner join 
    "product_categories" on "products"."category_id" = "product_categories"."id" 
left join 
    "product_features" on "products"."id" = "product_features"."product_id" 
where 
    "products"."category_id" in (58) and 
    ((product_features.feature_category_id = 1 
     and product_features.feature_option_id = 58) 
    and (product_features.feature_category_id = 46 
      and product_features.feature_option_id = 62)) 
+0

Какая эта СУБД для этого? Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

ответ

0

Вы можете получить продукты, которые соответствуют вашим условиям использования group by и having:

select p.id 
from products p join 
    product_categories pc 
    on p.category_id = pc."id" left join 
    product_features pf 
    on p.id = pf.product_id 
where p.category_id in (58) and 
     ((pf.feature_category_id = 1 and pf.feature_option_id = 58) or 
     (pf.feature_category_id = 46 and pf.feature_option_id = 62) 
    ) 
group by p.id 
having count(distinct feature_category_id) = 2; 

Если вам нужно больше полей из select, вы можете либо присоединиться к ним или включить их в group by.

+0

Это должно помочь просто понять, как это сделать в Laravel, потому что метод в его построителе запросов БД не может принять такую ​​форму данных? – Remark

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