2012-08-31 44 views
0

好了,所以我有三個表, images(ID, name,..)tags(ID, name, ..)和 一個與連接image_tags(imageID, tagID)不能想出一個好的SQL查詢

這是我的問題,我試圖編寫一個查詢,獲取所有具有特定標記ID的圖像+

聽起來很簡單,所以我想。我知道我可以通過獲取所有帶有一個標籤的圖像來做到這一點,然後檢查所有圖像是否有其他標籤,但性能成本有點太高。

希望對此事有任何意見..

+0

嗯,我使用一個連接時,我希望所有的只有一個標籤的圖像,但並不多工作.. – ember

+1

發佈你的sql代碼,發佈結果,並告訴我們你得到的結果有什麼問題。 – BugFinder

+0

看到這個問題:[**如何篩選具有多對多關係的SQL結果](http://stackoverflow.com/questions/7364969/how-to-filter-sql-results-in-a有很多通過關係) –

回答

-1

請問您可以使用嗎?

SELECT * from image_tags i1, image_tags i2 
WHERE i1.imageID = i2.imageID 
AND i1.tagID != i2.tagID 
+0

這看起來像它的工作:D 當有大量的標籤,但我想它不能被幫助時,將愚蠢的大型查詢。 非常感謝您的幫助:) – ember

+0

看着您的評論回覆@JaMaBing,似乎你應該擺脫'GROUP BY' ......但很高興我可以幫助:) – m4573r

+0

是的,已經擺脫它了,一旦我添加了tagID條件,什麼都不做; D – ember

0

試試這個

SELECT images.ID, COUNT(DISTINCT tags.ID) as counter FROM images 
LEFT JOIN image_tags ON (images.ID=image_tags.imageID) 
LEFT JOIN tags ON (image_tags.tagID=tags.ID) 
GROUP BY images.ID HAVING COUNT (tags.ID) >=2 
+0

對不起,我似乎沒有足夠清楚我的問題,我想要得到的是具有特定tagID的所有圖像,如tagID = 1020和tagID = 1016不只是一個列出具有多於兩個標籤的所有圖像。 – ember

0

我想你想查詢的是:

SELECT images.ID, COUNT(DISTINCT tags.ID) as counter 
FROM image_tags it 
group by it.imageID 
having max(case when it.tagID = 1020 then 1 else 0 end) = 1 and 
     max(case when it.tagID = 1016 then 1 else 0 end) = 1 

該集團所有給定圖像標籤彙集。 having子句確保它有兩個你想要的標籤。如果你只想要這兩個標籤,那麼你可以加上一句:

max(case when it.tagID not in (1020, 1016) then 1 else 0 end) = 0