在MySQL问题(php)中加入表

时间:2010-01-18 13:08:42

标签: php mysql join left-join

情况:

在我的数据库中,我有一个名为“艺术家”和“标签”的表格。

每位艺术家都有一组标签,保存在链接表“ 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    

标记

id | tag_name

欢迎任何帮助。

由于

2 个答案:

答案 0 :(得分: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)对结果进行排序。

答案 1 :(得分: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'