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

选择表中行对应的所有数据(SQL)

  •  1
  • good_afternoon  · 技术社区  · 6 年前

    编辑:使用MySQL。

    Posts表有一个对应于Users表和id列的userid外键。

    taged_posts表有两个外键,一个用于tag_id,另一个用于post_id

    标签表只有一个id和一个slug。

    我试图查询帖子并返回与该帖子相关的所有数据,即帖子数据、帖子的用户数据以及属于该帖子的标记。

    一个帖子可以有很多标签。

    这是我正在使用的SQL查询:

    $sql = "SELECT posts.title, users.name, users.handle, users.email, tags.slug as tags
    from posts 
    INNER JOIN users ON posts.user_id = users.id
    INNER JOIN tagged_posts ON posts.id = tagged_posts.post_id
    INNER JOIN tags ON tagged_posts.tag_id = tags.id";
    

    由于这个特定的post有3个与之相关联的标记,查询将同一post返回3次,并为标记列出不同的值。见下文:

    Array
    (
        [0] => Array
            (
                [title] => This is my first Post!
                [name] => exampleuser
                [handle] => example
                [email] => example@gmail.com
                [tags] => database-design
            )
    
        [1] => Array
            (
                [title] => This is my first Post!
                [name] => exampleuser
                [handle] => example
                [email] => example@gmail.com
                [tags] => sql
            )
    
        [2] => Array
            (
                [title] => This is my first Post!
                [name] => exampleuser
                [handle] => example
                [email] => example@gmail.com
                [tags] => php
            )
    
    )
    

    我能做一个单一的查询,并得到所有相关的职位?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Gordon Linoff    6 年前

    您希望将结果连接在一起。例如,在MySQL中,您可以执行以下操作:

    select p.title, u.name, u.handle, u.email, group_concat(t.slug) as tags
    from posts p join
         users u 
         on p.user_id = u.id join
         tagged_posts tp
         on p.id = tp.post_id join
         tags t
         on tp.tag_id = t.id
    group by p.title, u.name, u.handle, u.email;