Задать вопрос
kratkar
@kratkar
web-developer

Как правильно сделать SQL запрос по нескольким значениям одного поля?

Пример таблица:
| product_id | field_id | value_id |
|     1      |  f1      |     v1   |
|     2      |  f1      |     v2   |
|     3      |  f2      |     v3   |
|     4      |  f2      |     v4   |

Получить product_id при условии, что value_id in (v1, v2) AND value_id in (v3, v4)
Через group by product_id having COUNT(*) = 2 думаю не получится, т.к. могут быть совпадения значений у одного поля(например, у товара с field_id = f2 и value_id in (v3, v4) ). Хотя если грамотно составить, то, возможно, получится. У меня не получилось :)
  • Вопрос задан
  • 2479 просмотров
Подписаться 2 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 3
@alexalexes
Не знаю, как это правильно называется. "Межстрочный AND по значениям столбца" реализуется пересечением одной таблицы самой себя столько раз, сколько нужно членов and для сравнения.
В общем, в выражении exists реализована такая конструкция.
select ext.*
from ext
where 
exists (select 1 from t as t1
                         join t as t2 on t1.field_id = t2.field_id
                          where t1.field_id = ext.f1
                              and t1.value_id = v1 
                              and t2.value_id = v2 )
and exists (select 1 from t as t1
                         join t as t2 on t1.field_id = t2.field_id
                          where t1.field_id = ext.f2
                              and t1.value_id = v3 
                              and t2.value_id = v4 )
Ответ написан
LaRN
@LaRN
Senior Developer
Можно вот так попробовать:
SELECT product_id, 
        SUM(CASE WHEN field_id = 'f1' AND value_id in (v1, v2) THEN 1 ELSE 0 END), 
        SUM(CASE WHEN field_id = 'f2' AND value_id in (v3, v4) THEN 1 ELSE 0 END)
   FROM product
  WHERE value_id In (v1, v2, v3, v4) 
  GROUP BY product_id
 HAVING SUM(CASE WHEN field_id = 'f1' AND value_id in (v1, v2) THEN 1 ELSE 0 END) = 1
    AND SUM(CASE WHEN field_id = 'f2' AND value_id in (v3, v4) THEN 1 ELSE 0 END) = 1
Ответ написан
@MaximaXXl
Я не очень понял что Вы хотели и чего нельзя с having count, но помоему это выглядит так:
SELECT product_id, count(distinct field_id) cnt_f, count(distinct value_id) cnt_v
from product
where (   (field_id =  'f1' and value_id in ('v1', 'v2')) 
          or  (field_id =  'f2' and value_id in ('v3', 'v4'))
           )
group by  product_id
having count(distinct field_id) = 2 and count(distinct value_id) = 2

Если надо чтобы уникальных значений было по 2, если Вы боитель за дубликаты можете ввести вместо count(distinct value_id) -> count(*) = 2
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы