示例数据集:
id | tag
---|------
1 | car
1 | bike
2 | boat
2 | bike
3 | plane
3 | car
id
并且tag
都被索引。
我正在尝试获取与标签 [汽车、自行车] 匹配的 ID(标签的数量可能会有所不同)。
这样做的一个天真的查询是:
SELECT id
FROM test
WHERE tag = 'car'
OR tag = 'bike'
GROUP BY id
HAVING COUNT(*) = 2
但是,这样做是非常低效的,因为 group by 并且任何匹配一个标签的行都被考虑到 group by (而且我有很大的体积)。
对于这种情况有更有效的查询吗?
我看到的唯一解决方案是让另一个表包含以下内容:
id | hash
---|------
1 | car,bike
2 | boat,bike
3 | plane,car
但这不是一个易于实施和保持最新的解决方案。
附加信息:
- 名称匹配必须准确(无全文索引)
- 标签的数量并不总是 2