2012-06-12 70 views
1

無法理解如何通過第二個表中的標記信息來過濾圖像表。簡單的MySQL加入

所以我必須與所有的基礎領域的圖像表:

id | 
title | 
userid | 
timestamp | 
status 

,我有一個標籤表:

id | 
imageid | 
text (contains a single tag) 

我希望做的是簡單的:採取名單的標籤並獲取列表中包含所有標籤的圖像列表。我無法把頭圍住它。

任何幫助非常感謝,謝謝!

回答

2
SELECT 
    a.* 
FROM 
    images a 
INNER JOIN 
    tags b ON a.id = b.imageid 
WHERE 
    b.text IN ('tag1', 'tag2', 'tag3') 
GROUP BY 
    a.id 
HAVING 
    COUNT(*) = 3 

'tag1', 'tag2', 'tag3'是您輸入標籤的列表 HAVING子句中的3是標籤列表中標籤計數的輸入。

0

假設您沒有每個imageid的重複標籤,您可以加入一個查詢,對每個標籤的標籤進行計數,將帶有IN()子句的標籤限制爲您要搜索的列表。

然後用HAVING條款,拒絕其計數不等於在列表的標籤數量的項目(那些具有較完整列表更少):

SELECT 
images.* 
FROM 
    images 
    JOIN (
    SELECT 
    imageid, 
    COUNT(*) AS numtags 
    /* could also be COUNT(DISTINCT text) */ 
    FROM tags 
    /* Put only the tags you want into an IN() clause */ 
    WHERE text IN ('tag1,'tag2','tag3') 
    GROUP BY imageid 
    /* If an image has all 3 tags, COUNT(*) = 3 */ 
    HAVING numtags = 3 
) tlist ON images.id = tlist.imageid