代码之家  ›  专栏  ›  技术社区  ›  axsuul

SQL查询:获取与post关联的标记

  •  5
  • axsuul  · 技术社区  · 16 年前

    我有三张桌子。

    posts
    | id      | title     |
    +---------+-----------+
    | 1       | hello     |
    | 2       | goodbye   |
    +---------+-----------+
    
    posts_tags
    | tag_id  | post_id   |
    +---------+-----------+
    | 1       | 1         |
    | 2       | 1         |
    | 2       | 2         |
    +---------+-----------+
    
    tags
    | id      | name      |
    +---------+-----------+
    | 1       | news      |
    | 2       | photos    |
    +---------+-----------+
    

    我想能够选择帖子,但结果是这样

    post.id    post.title    tags
    ------------------------------------
    1          hello         news,photos
    2          goodbye       photos
    

    有点像

    SELECT *,
           GROUP_CONCAT(tags.name) AS tags
    FROM posts
        LEFT JOIN posts_tags
            ON posts.id = posts_tags.post_id
        LEFT JOIN tags
            ON posts_tags.tag_id = tags.id
    

    似乎工作不正常。请告知,谢谢您的时间:)

    2 回复  |  直到 16 年前
        1
  •  1
  •   zerkms    16 年前

    更好的方法是在posts表的字符串中额外存储标签,以防止额外的连接和分组。就像性能非规范化一样。

        2
  •  11
  •   Phil Ross Matt Johnson-Pint    16 年前

    您需要添加 GROUP BY 查询子句:

    SELECT posts.*,
           GROUP_CONCAT(tags.name ORDER BY tags.name) AS tags
    FROM posts
        LEFT JOIN posts_tags
            ON posts.id = posts_tags.post_id
        LEFT JOIN tags
            ON posts_tags.tag_id = tags.id
    GROUP BY posts.id
    

    我还向 GROUP_CONCAT 上面显示的是按指定顺序连接的标记。