Есть таблица с товарами "products", пускай будет два поля: id и name.
Еще есть две таблицы: "characteristics_value" с полями id и value, и "char_product" (для связи товаров с характеристиками) с полями id_product и id_characteristic нужно написать запрос который покажет товары с определенными характеристиками, например:
Есть 4 товара "products"
id - name
1 - iphone
2 - samsung
3 - nokia
4 - motorola
У них есть характеристики "characteristics_value"
id - value
1 - белый
2 - черный
3 - 64 гб
4 - 32 гб
Связи с товарами "char_product"
id_product - id_characteristic
1 - 1
2 - 1
3 - 1
4 - 2
1 - 3
2 - 3
3 - 4
То есть получается есть iphone c характеристиками "белый","64 гб", samsung "белый","64 гб", nokia "белый","32 гб" и motorola "черный"
Когда выбираем фильтр "белый" должно показать 3 телефона: iphone,samsung и nokia. Потом если добавить фильтр 64 гб, должно оставить только iphone и samsung. Какой должен быть sql запрос чтобы показать нужные товары при выбранных фильтрах ? Я понимаю что возможно не совсем удачная архитектура БД для таких действий, но увы, что есть...
SELECT product.id, product.name, characteristic.id, characteristic.value
FROM product_characteristic_link
LEFT JOIN product ON product_characteristic_link.product_id = product.id
LEFT JOIN characteristic ON product_characteristic_link.characteristic_id = characteristic.id
WHERE characteristic.value = 'white'
Такой вариант подойдет если только по 'white' искать а если добавить в этот же запрос еще и '64 гб' то покажет и товары которые белые и товары которые с 64 гб а должно из белых выбрать те которые с 64 гб
Вобщем я решил проблему, сделал так:
SELECT DISTINCT `res`.`id_product` FROM `products_characteristics` AS `res`
INNER JOIN `products_characteristics` AS `f1` ON (`f1`.`id_product` = `res`.`id_product` AND `f1`.`id_characteristic` = '1')
INNER JOIN `products_characteristics` AS `f2` ON (`f2`.`id_product` = `res`.`id_product` AND `f2`.`id_characteristic` = '3')
Первый INNER оставляет только белые телефоны а второй из белых оставляет те что с 64 гб.
Как-то так:
select distinct p.name from products p
join char_product cp on cp.id_product=p.id and cp.id_characteristic in (select id from characteristics_value where value in ('white', '64Gb'))
Сергей, если присмотреться, то можно заметить, что это был ответ на комментарий от 28 марта, и прошло менее 10 минут. А основной ответ был дан более двух лет назад, ага.