2010-01-18 25 views
0

現狀:連接表

在我的數據庫中,我有一個名爲 '藝術家' 和 '標籤' 表。

每位藝術家都有一組標籤,保存在鏈接表'artisttags'中。

每個唯一標籤保存在名爲'標籤'的表中。

問題

我想表明,有一個共同的(或更多)標籤與給定的藝術家的所有藝術家。

function getSimilarArtists($artist_id) 
{ 
    $sql = "SELECT ..."; 
    $query = mysql_query($sql); 
    while($artist = mysql_fetch_assoc($query)) 
    { 
     $html .= "<li>".$artist['name']."</li>"  
    } 
    print($html); 
} 

藝術家

id | name 

artisttags

id | artist_id | tag_id  

標籤s

id | tag_name 

任何幫助是值得歡迎的。

感謝

回答

3

那些外的Mitosz的答覆加入真的要傷害 - 並且將返回每一位藝術家 - 不只是那些有「一個(或多個)共同標籤」。使用內部聯接,而不是

SELECT similar.name, count(*) as commontags 
FROM artists current, 
    artisttags curtags, 
    artisttags simtags, 
    artists similar 
WHERE current.id=curtags.artist_id 
    AND curtags.tag_id=simtags.tag_id 
    AND simtags.artist_id=similar.id 
ORDER BY count(*) DESC; 

當然,對於一個聰明的索引系統,你可以申請到得分標記表中的每個標籤(例如根據用戶投票或基數)和SUM的結果(tag.score)排序。

+0

我得到這個錯誤:混合GROUP列(MIN(),MAX(),COUNT(),...)沒有GROUP列是非法的不是GROUP BY子句 – Bundy 2010-01-18 13:38:57

+0

,我應該在哪裏提供'給定的藝術家ID'? – Bundy 2010-01-18 13:42:16

+0

添加到查詢GROUP BY similar.id,similar.name。還要添加AND current.id = $ currentArtist(通過適當的安全檢查)。 – SorcyCat 2010-01-18 17:28:45

2
SELECT DISTINCT a.name FROM artisttags at 
LEFT JOIN artisttags at2 
ON at2.tag_id = at.tag_id 
LEFT JOIN artists a 
ON at2.artist_id = a.id 
WHERE at.id = '$artist_id' 
+0

謝謝!雖然有點小錯誤:at.id ='$ artist_id'應該是at.artist_id ='$ artist_id' – Bundy 2010-01-18 13:33:47

+0

正如symcbean所說,內部連接會更有效率,因此您最好使用他的答案;) – milosz 2010-01-18 13:36:43

+0

添加行 GROUP BY similliar.name 後ORDER BY計數(*)DESC – milosz 2010-01-18 13:42:06