Пример набора данных:
id | tag
---|------
1 | car
1 | bike
2 | boat
2 | bike
3 | plane
3 | car
id
и tag
проиндексированы.
Я пытаюсь получить идентификатор, соответствующий тегам [автомобиль, велосипед] (количество тегов может варьироваться).
Наивный запрос для этого был бы таким:
SELECT id
FROM test
WHERE tag = 'car'
OR tag = 'bike'
GROUP BY id
HAVING COUNT(*) = 2
Однако это довольно неэффективно из-за группы по и того факта, что любая строка, соответствующая одному тегу, учитывается для группы по (а у меня большой объем).
Есть ли более эффективный запрос для этой ситуации?
Единственное решение, которое я вижу, - это иметь другую таблицу, содержащую что-то вроде:
id | hash
---|------
1 | car,bike
2 | boat,bike
3 | plane,car
Но это решение непросто реализовать и поддерживать в актуальном состоянии.
Дополнительная информация:
- соответствие имен должно быть точным (без полнотекстового индекса)
- количество тегов не всегда 2