2014-12-22 4 views
0

У меня есть две таблицы в моей БД, которые я хочу сделать для запроса выбора Первый хранит идентификатор продукта (int), и если продукт опубликован Во второй таблице хранятся фильтры , и совпадает с id_product (в основном это product_id от Products). в id_filter_child мы имеем значениеmySQL множественный выбор из двух таблиц (фильтрация)

продукты

product_id, 
published 

фильтры

id_pro_fil, 
id_product, 
id_filter_child 

Мои таблицы теперь:

продукты

1  yes 
2  yes 
3  no 

фильтры

10 1 4 
11 1 5 
12 2 4 
13 2 6 
14 2 7 

Так что это моя БД на данный момент. От входа у меня есть фильтры, которые я хочу искать Так я хочу, чтобы выбрать все продукты с фильтром = 4 я использую:

SELECT * FROM products,filters 
WHERE products.product_id=filters.id_product 
    AND products.published='1' 
    AND filters.id_filter_child='4' 

, что один работает!

Теперь мне нужно, чтобы выбрать все продукты с фильтром 4 и 6. я использую:

SELECT * FROM products,filters 
WHERE products.product_id=filters.id_product 
    AND products.published='1' 
    AND filters.id_filter_child='4' 
    AND filters.id_filter_child='6' 

, но я не работает (в результате я хотел бы продукт с идентификатором = 2)

Некоторые помогают пожалуйста

заранее спасибо

ответ

0

Если вы хотите выбрать все продукты, то нет причин включать фильтры. Один из подходов заключается в использовании агрегации и having пункт:

SELECT p.* 
FROM products p JOIN 
    filters f 
    ON p.product_id = f.id_product 
WHERE p.published = '1' 
GROUP BY p.product_id 
HAVING SUM(f.id_filter_child = '4') > 0 AND 
     SUM(r.id_filter_child = '6') > 0 

Это возвращает продукт, который есть как фильтр 4 и отфильтровывать 6.

Обратите внимание, что я также фиксированный запрос на использование правильного, четкого join синтаксиса.

Мне нравится этот метод для подзапросов «set-in-sets», потому что он довольно общий. Вы можете добавить еще один фильтр в предложение HAVING с аналогичным условием. Вы можете получить все с 4, но не 6, изменив второй > 0 на = 0.

0

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

SELECT p.* 
FROM products p 
LEFT JOIN filters ON p.product_id = f.id_product 
WHERE p.published='1' AND f.id_pro_fil IN (4,6) 
0

Рассмотрим логику:

AND filters.id_filter_child='4' 
AND filters.id_filter_child='6' 

Вы, чтобы в каждом filter_child в базе данных, чтобы иметь два РАЗЛИЧНЫХ значения одновременно."Эта запись должна быть банан и феррари одновременно в нуль"

Вы хотите OR вместо:

AND ((filter_child = '4') OR (filter_child = '6')) 

(обратите внимание на дополнительные скобки), или более компактно:

AND (filter_child IN ('4', '6')) 

--- comment followup

Если вам нужны оба значения для прикрепления к записи, то вам придется использовать дополнительную логику:

SELECT *, COUNT(filters.id_filter_child IN ('4', '6')) AS count 
FROM products,filters 
WHERE products.product_id=filters.id_product 
    AND products.published='1' 
    AND filters.id_filter_child IN ('4', '6') 
GROUP BY filters.id_filter_child 
HAVING count = 2 

В where возвращает только те записи, которые имеют либо 4 или 6 для filter_child - это будет ловить записи, которые имеют по крайней мере один из этих двух значений. Затем бизнес-файл COUNT(..) + GROUP + HAVING отфильтровывает все, кроме тех записей, которые имеют BOTH значений.

+0

Я все еще нуждаюсь в продукте, чтобы иметь как 4, так и 6 , если я использую OR, я получаю неправильный результат Мне нужен продукт с 4 И 6 ... –

0

Вы можете использовать ИЛИ или В

SELECT * FROM products,filters 
    WHERE products.product_id=filters.id_product 
     AND products.published='1' 
     AND (filters.id_filter_child='4' OR filters.id_filter_child='6') 

SELECT * FROM products,filters 
    WHERE products.product_id=filters.id_product 
     AND products.published='1' 
     AND filters.id_filter_child IN (4,6) 
0

вы должны ИЛИ между этими двумя условиями:

SELECT * FROM products,filters 
WHERE products.product_id=filters.id_product 
    AND products.published='1' 
    AND filters.id_filter_child='4' 
    OR filters.id_filter_child='6' 

, но, чтобы сделать ваш SQL меньше и проще вы можете использовать IN оператора также:

SELECT * FROM products,filters 
WHERE products.product_id=filters.id_product 
    AND products.published='1' 
    AND filters.id_filter_child IN(4,6) 
Смежные вопросы