MySQL问题中的连接表(php)

发布于 2024-08-18 09:34:24 字数 786 浏览 7 评论 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    

标签

id | tag_name

欢迎任何帮助。

谢谢

Situation:

In my database I have a table called 'artists' and 'tags'.

Each artist has a set of tags, saved in a linking table 'artisttags'.

Each unique tag is saved in a table called 'tags'.

Problem

I would like to show all artists that have one (or more) tags in common with a given artist.

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

Tables

artists

id | name

artisttags

id | artist_id | tag_id    

tags

id | tag_name

Any help is welcome.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

掩于岁月 2024-08-25 09:34:24

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) 对结果进行排序。

Those outer joins in Mitosz's reply are really going to hurt - and will return every artist - not just those with "one (or more) tags in common". Use Inner Joins instead

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;

Of course, for a smarter indexing system you could apply scoring to each tag in the tags table (e.g. based on user votes or cardinality) and sort your results by SUM(tag.score).

沧笙踏歌 2024-08-25 09:34:24
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'
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'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文