mysql - 优化多对多关系的查询以搜索不相关的标签

标签 mysql many-to-many

我正在开发一个应用程序,该应用程序将通过禁用搜索池中的不相关标签来进行某种智能数据搜索。

例如(对不起,如果我的格式可能很糟糕),给出这个表:

    _id  |  _tagname
    1       A
    1       B
    1       C
    2       A
    2       B
    3       A
    4       B
    5       C
    6       D

当用户选择标签A时,(以下将对每个标签选择执行):

  1. 获取与标签匹配的 ID -> 1, 2, 3 现在将成为新的搜索池
  2. 隐藏所有不相关的标签 -> D 因为标签 BC 将允许用户过滤标签以获取编号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/

相关文章:

java - JPA 多对多约束

many-to-many - Spring Data JPA 多对多保存设置

python - 更新多对多关系

python - Django get() 返回了不止一个

ruby-on-rails - Rails 3 - 嵌套资源的索引 View

php - 从 URL 中去掉括号(和内容)

php - mysql pconnect ,当它关闭连接时

mysql - 为什么 MySQL COUNT(*) 查询返回空集?

mysql - 层次结构、临时表插入自

php - 如何在创建数据库之前忽略配置文件