我正在开发一个应用程序,该应用程序将通过禁用搜索池中的不相关标签来进行某种智能数据搜索。
例如(对不起,如果我的格式可能很糟糕),给出这个表:
_id | _tagname
1 A
1 B
1 C
2 A
2 B
3 A
4 B
5 C
6 D
当用户选择标签A时,(以下将对每个标签选择执行):
- 获取与标签匹配的 ID -> 1, 2, 3 现在将成为新的搜索池
- 隐藏所有不相关的标签 -> D 因为标签 B 和 C 将允许用户过滤标签以获取编号1
TL;DR:这是我目前的方法,我想知道是否有优化它的方法,因为目前需要很长时间才能得到结果
SELECT _tagname FROM datatags WHERE
(_tagname) NOT IN
( SELECT _tagname FROM datatags WHERE
_id IN (1,2,3))
GROUP BY _tagname
谢谢!这是我第一次发布问题,所以请放轻松 :)
编辑:格式化
最佳答案
您最终是要寻找一起出现的标签,还是真的要排除奇怪的标签?
这里有两种查找相关标签的方法(返回 { A, B, C }
for A
or B
or C
,并为 D
返回 { D }
)
使用相关子查询:
SELECT DISTINCT _tagname FROM datatags WHERE _id IN (SELECT _id FROM datatags WHERE _tagname = ?)
使用自连接:
SELECT DISTINCT b._tagname FROM datatags a JOIN datatags b USING (_id) WHERE a._tagname = 'A'
对于相反的情况(从未出现在给定标签中的标签),您会发现整组标签和相关标签之间的区别。 MySQL 不支持 MINUS
,但这里有一种查找不相关标签的方法:
使用带有自连接的相关子查询:
SELECT _tagname FROM datatags LEFT JOIN (SELECT DISTINCT _tagname FROM datatags WHERE _id IN (SELECT _id FROM datatags WHERE _tagname = ?)) a USING (_tagname) WHERE a._tagname IS NULL
关于mysql - 优化多对多关系的查询以搜索不相关的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13926408/