情况:
在我的数据库中,我有一个名为“艺术家”和“标签”的表格。
每位艺术家都有一组标签,保存在链接表“ 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
欢迎任何帮助。
由于
答案 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'