2012-12-18 46 views
1

我上的應用程序,將通過在搜索游泳池禁止無關標籤做一些智能數據搜索的工作。優化查詢了許多一對多的關係,尋找無關標籤

例如(抱歉,如果我的格式可以是蹩腳),鑑於此表:

_id | _tagname 
    1  A 
    1  B 
    1  C 
    2  A 
    2  B 
    3  A 
    4  B 
    5  C 
    6  D 
當用戶選擇標籤 ,(下面將關於 每個標籤選擇執行)

  1. 取的ID,將匹配的標籤 - >1,2,3現在將是新的搜索池
  2. 隱藏所有標籤將不相關 - >d因爲標籤Ç將允許用戶過濾標籤來獲取ID

TL; DR:這是我目前的做法,如果有辦法優化它,因爲它是目前花費的時間太長得到的結果

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

謝謝你,我不知道!這是我第一次發佈提問,請把它給我:)容易

編輯:格式化

回答

0

你最終尋找那一起出現,或做你真正想要的奇怪標記出來的標籤?

這裏有兩種方法可以找到相關的標籤(ABC返回{ A, B, 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 
    
+0

最終,我只是想找到不會有助於濾除當前ID的標籤列表。由於如果當前結果返回ID的** 1,2,3 **,則標籤** D **與進一步縮小結果完全無關,因爲** 1,2,3 **都沒有標籤* * d **。所以我想確保標籤** D **可以被「建議」爲不相關的。 你的答案看起來可能會很快,我會嘗試並讓你知道! – immoteous

+0

它大約快了8-9倍(這真是太神奇了),但考慮到我的表的大小,它還是相當長的。但你的建議幫助我形成另一種解決方案。謝謝,所以我會接受你的回答:) – immoteous

+0

這是對未來的任何人有類似的問題: ,因爲這是一個多對多的關係,有一張表,其中包含所有可用標籤的唯一列表,所以使用user113215的建議,在**標記**表和** _標記名**的** distinct **列表之間進行左連接。關於**連接**的信息: http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins – immoteous