1

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

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

    _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将允许用户过滤标签以获得 ID 1

TL;DR:这是我目前的方法,我想知道是否有办法优化它,因为目前获得结果需要很长时间

SELECT _tagname FROM datatags WHERE 
(_tagname) NOT IN 
( SELECT _tagname FROM datatags WHERE 
_id IN (1,2,3)) 
GROUP BY _tagname

谢谢!这是我第一次发布问题,所以请放轻松:)

编辑:格式化

4

1 回答 1

0

你最终是在寻找一起出现的标签,还是真的想要那些奇怪的标签?

{ A, B, C }以下是查找相关标签的两种方法(返回AorBC返回){ 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
    
于 2012-12-18T04:59:29.567 回答