@Barrakuda74

Как в sql выбрать строки, которые содержат сразу несколько тегов?

Ребят как в sql выбрать строки, которые содержат сразу несколько тегов?

Имеем две таблицы:

FruitsTABLE
id   name
1    яблоко
2    банан
3    апельсин


FruitTagTABLE
fruit    tag
1        сладкий
1        круглый
2        сладкий
3        сладкий
3        круглый


У меня получилось сделать запрос фруктов, которые содержат какой-либо 1 тег:
SELECT DISTINCT fruitsTABLE.* FROM FruitsTABLE JOIN FruitTagTABLE ON FruitsTABLE.id = FruitTagTABLE.id WHERE FruitTagTABLE.tag = 'сладкий' OR FruitTagTABLE.tag = 'круглый'


Т.е. объединяем две таблицы через JOIN, находим в каких фруктах есть 'сладкий' или 'круглый' и избавляемся от дублей через DISTINCT.

А как мне получить только фрукты, которые одновременно И сладкие И круглые?
На самом деле у меня 3 таблицы, поэтому вместо "круглый" "сладкий" там только ID тегов указаны, т.е. 1 и 2.
Предполагаю такой вариант, объединение через GROUP_CONCAT для получения ячейки "1,2", а потом запрос какой-то чтобы искать где содержится у фруктов в такой ячейке и "1", и "2", только где гарантия, что он не найдёт мне фрукты с тегами "1,22".

В общем думается мне что как-то попроще можно решить этот вопрос. Не подскажете в каком направлении копать?
  • Вопрос задан
  • 985 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `f`.*
  FROM `FruitsTABLE` AS `f`
  JOIN `FruitTagTABLE` AS `ft1` ON `ft1`.`tag` = :tag1 AND `ft1`.`id` = `f`.`id`
  JOIN `FruitTagTABLE` AS `ft2` ON `ft2`.`tag` = :tag2 AND `ft1`.`id` = `f`.`id`
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@edb
SQL
select * 
from FruitsTABLE f
where name = 'яблоко'
  and exists (select * 
              from FruitTagTABLE t 
              where t.fruit = f.fruit
                and f.tag  = 'сладкий'
             )
  and exists (select * 
              from FruitTagTABLE t 
              where t.fruit = f.fruit
                and f.tag  = 'круглый'
             )

что-то похожее уже было:
https://toster.ru/answer?answer_id=867572
Ответ написан
Ваш ответ на вопрос

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

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