grefon
@grefon

Как в MySQL выбрать группу строк с разными условиями по 1 столбцу?

Доброго времени суток!
Подскажите, пожалуйста, есть ли возможность сделать выборку в следующей задачи без подзапросов?

Имеется: таблица с тегами и их значениями для записи:

item_id       |   tag_key             |   tag_value
------------------------------------------------------------
1             |   Цвет                |   Красный
1             |   Размер              |   2
1             |   параметр...N        |   Значение...N
1             |   Скорость            |   500

2             |   Цвет                |   Зеленый
2             |   Размер              |   3
2             |   Скорость            |   400


Для каждого item_id прописывается связка tag_key : tag_value. Записей и разных тегов может быть сколько угодно.
Нужно выбрать сгруппированные данные по item_id, но по условию в tag_key и/или tag_value.

К примеру, есть условие: Цвет = Красный и Скорость = 500. По этому условию нужно выбрать все item_id и все соответствующие tag_key : tag_value. Можно было бы решить задачу подзапросом:

SELECT * FROM tags WHERE item_id IN (SELECT tags FROM item_id WHERE tag_key = 'Цвет' AND tag_value = 'Красный')


Но проблема в том, что условий может быть много, в том числе и отрицательных: Цвет = Красный и Скорость != 500.

Может быть есть какие-то идеи для написания одного запроса?
  • Вопрос задан
  • 601 просмотр
Пригласить эксперта
Ответы на вопрос 4
@kirill-93
Я так полагаю, что у вас опечатка вот тут
SELECT tags FROM item_id

Если, да, то какой смысл в подзапросе? Почему не написать
SELECT * FROM tags WHERE tag_key = 'Цвет' AND tag_value = 'Красный'

?
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Убирайте подзапрос, делайте JOIN по каждому условию..
Ответ написан
romy4
@romy4
Exception handler
Правильно говорят. Inner join на саму таблицу столько раз, какое количество условий
Ответ написан
Комментировать
grefon
@grefon Автор вопроса
Огромное спасибо за помощь!
Получился следующий запрос для условия "Цвет = Красный и Скорость != 500"
SELECT tag.* FROM tags AS tag 
INNER JOIN tags AS tag1 ON tag.item_id = tag1.item_id 
INNER JOIN tags AS tag2 ON tag.item_id = tag2.item_id 
WHERE tag1.tag_key = 'Цвет' AND tag1.tag_value = 'Красный' AND tag2.tag_key = 'Скорость' AND tag2.tag_value != '500'
Ответ написан
Ваш ответ на вопрос

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

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