2013-11-26 68 views
0

假設我有關於文章和標籤的典型M:​​N關係表。MySQL:M:N關係的子集和超集

article_id | tag_id 
------------+-------- 
A1   | T1 
A1   | T2 
A1   | T3 
A2   | T1 
A2   | T2 
A3   | T1 
A3   | T4 

在這個例子中的文章A1的標記(T1,T2,T3)是物品A2的標記(T1,T2)的超集。反之亦然,A2的標籤是A1的子集。 A3不是超集,也不是A1或A2標籤的子集。

找出AX標籤是否屬於AY的最有效方法是什麼?

回答

0

您可以測試一個集是否是查詢中使用子查詢的另一子集,像這樣:

select tag_id from tablename where article_id=AX 
and tag_id not in (select tag_id from tablename where article_id=AY) 

如果查詢返回1條或多個記錄,則有在AX標籤不屬於在AY(即AX的標籤不是AY標籤的子集)。

如果查詢返回0條記錄,則AX中沒有標籤不在AY中(即AX標籤是AY標籤的子集)。

+0

相關子查詢都相當慢:(我需要這個數以百萬計的文章對使用此功能。 –

1

不能你只要運行

SELECT t1.* 
FROM tbl AS t1 
LEFT JOIN tbl as t2 
    ON t2.article_id ='A1' 
    AND t1.tag_id = t2.tag_id 
WHERE t1.article_id = 'A2' 
    AND t2.article_id IS NULL; 

如果沒有記錄返回,那麼所有A2的標籤是A1。然後,你可以在另一個查詢與EXISTSNOT EXISTS功能

+0

的問題是,如果我跑這是一個子查詢,這是行不通的 - MySQL不會將數據從主查詢傳遞到子查詢的on子句(MySQL 5.1.49)。 –

+0

它應該工作,因爲這是一種常用技術。如果你不知道如何去做,那麼發佈一個新的問題與您的主要查詢,以及你的努力實現。 – AgRizzo