我正在處理一個數據庫,其中項目被「標記」了一定次數。MySQL標記問題:如何選擇已標記爲X,Y和Z的項目?
項目(100K行)
- ID
- 名
- 其他的東西
標籤(10K行)
- ID
- 名
item2tag(1,000,000行)
- ITEM_ID
- TAG_ID
- 數
我正在尋找最快的解決方案:
選擇已標記爲X,Y和Z(其中X,Y和Z對應於(可能)標記名稱)的項目?
這裏是我迄今...我只是想確保我在做它的最好的方式:
首先從名字得到tag_ids:
SELECT tag.id WHERE name IN ("X","Y","Z");
然後我組由那些tag_ids和使用具有過濾結果:
SELECT item2tag.*, count(tag_id)
FROM item2tag
WHERE tag_id=1 or tag_id=2 or tag_id=3
GROUP BY item_id
HAVING count(tag_id)=3;
然後,我可以剛剛從具有這些ID的項目中進行選擇。
SELECT * FROM item WHERE id IN ([results from prior query])
我在item2tag中有數百萬行,索引在(item_id,tag_id)上。這會是最快的解決方案嗎?
+1你比我快。 :)是的,特別是在MySQL中,分組解決方案很慢。我會使用自聯接解決方案。一定要在(item_id,tag_id)上創建一個複合索引。 – 2010-07-15 22:25:55
副本不應該加入到T1,而不是互相鏈接? – 2010-07-15 22:28:17
@OMG小馬:在這種情況下,如果A = B且B = C,那麼A = C。這是其中六個中的六個。 – 2010-07-15 22:38:05