【问题标题】:Joining tables in MySQL question (php)在 MySQL 问题中加入表 (php)
【发布时间】:2010-01-18 13:08:41
【问题描述】:

情况:

在我的数据库中,我有一个名为“artists”和“tags”的表。

每个艺术家都有一组标签,保存在链接表“艺术家标签”中。

每个唯一标签都保存在名为“tags”的表中。

问题

我想显示与给定艺术家有一个(或多个)标签的所有艺术家。

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

艺术家标签

id | artist_id | tag_id    

标签

id | tag_name

欢迎任何帮助。

谢谢

【问题讨论】:

    标签: php mysql join left-join


    【解决方案1】:

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

    【讨论】:

    • 我得到这个错误:如果没有 GROUP BY 子句,混合没有 GROUP 列的 GROUP 列 (MIN(),MAX(),COUNT(),...) 是非法的
    • 我应该在哪里提供“给定的艺术家 ID”?
    • 添加到查询 GROUP BY similar.id,similar.name。还要添加 AND current.id=$currentArtist(进行适当的安全检查)。
    • 感谢 SorcyCat - 没错(我的大脑有点褪色)
    【解决方案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'
    

    【讨论】:

    • 谢谢!不过小错误:at.id = '$artist_id' 应该是 at.artist_id = '$artist_id'
    • 正如 symcbean 所说,内部连接会更有效,所以你最好使用他的答案;)
    • 在 ORDER BY count(*) DESC 之后添加 GROUP BY similliar.name 行
    • 好的,我应该在哪里提供“给定的艺术家 ID”?
    • 添加到 WHERE 子句:AND current.artist_id = '$artist_id'
    猜你喜欢
    • 2016-02-08
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多