small_jedi
@small_jedi

Как выбрать поля по значениям двух колонок?

Добрый день всем. Считал до недавнего времени, что разбираюсь в построении запросов пока не столкнулся с выборкой. Суть в том, что нужно выбрать `product_id` у записей, где указан `property_id` и `value`

39952fd2a6b00fa443818e0c3ab926ef.png

По началу я думал, что здесь обычный запрос вида, но результат ничего не выдавал. Не подскажите как правильно составить запрос?
SELECT `product_id` FROM `product_properties_values` WHERE (`property_id`=1 AND `value`=2) AND (`property_id`=3 AND `value`=3)


P.S
Стоит уточнить, что здесь логика фильтра товаров. Чем больше параметров выбирает пользователь, тем точнее должна быть выборка. Вариант с OR не подойдет потому что он будет выбирать записи как для левого условия так и правого
  • Вопрос задан
  • 151 просмотр
Решения вопроса 1
@Vitsliputsli
При условии, что product_id всегда имеет не более одного типа property_id:
SELECT `product_id` 
FROM `product_properties_values`
WHERE (`property_id`=1 AND `value`=2) OR (`property_id`=3 AND `value`=3)
GROUP BY product_id
HAVING count(*) = 2

, и при условии, что я угадал то, что вы хотите.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@ns174ru
https://ns174.ru
AND между вариантами замените на OR
Ответ написан
mahmudchon
@mahmudchon
SELECT `product_id` FROM `product_properties_values` WHERE `property_id` IN (1, 3) OR `value` IN (2, 3)
Ответ написан
idShura
@idShura
SELECT `product_id` FROM `product_properties_values` WHERE (`property_id`=1 AND `value`=2) OR (`property_id`=3 AND `value`=3)
Ответ написан
BojackHorseman
@BojackHorseman Куратор тега MySQL
...в творческом отпуске...
SELECT * FROM products p
WHERE EXISTS (SELECT 'x' FROM <filters_values_table> WHERE <filter_id_field> = ? AND <filter_value> = ? AND <product_id> = p.id)
AND EXISTS (SELECT 'x' FROM <filters_values_table> WHERE <filter_id_field> = ? AND <filter_value> = ? AND <product_id> = p.id)
....
AND EXISTS (SELECT 'x' FROM <filters_values_table> WHERE <filter_id_field> = ? AND <filter_value> = ? AND <product_id> = p.id)


с нужными составными индексами
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы