【问题标题】:Joining three tables and grouping连接三个表并分组
【发布时间】:2021-03-19 03:42:45
【问题描述】:


我对 SQL 和 php 等很陌生,所以对此表示歉意。 我有三个表,内容,作者内容和作者。我正在使用 SQL 语句来获取这个 json 数据

----------------------
|authorId | contentId|
|--------------------|
|1        |1         |
|1        |2         |
|2        |2         |
|2        |3         |
|3        |4         |
----------------------

但我希望它看起来像这样,每个作者都按照他们的所有内容分组。


|authorId | contentId|
|--------------------|
|1        |1,2       |
|2        |1,3       |
|3        |4         |
----------------------

我不确定这是否可以使用 SQL 并认为它们可能是更好的 PHP 解决方案。
我正在使用的 SQL 语句:

SELECT authors.authorId, content.contentId
FROM content
INNER JOIN content_authors
      ON content_authors.contentId = content.contentId
INNER JOIN authors
      ON content_authors.authorId = authors.authorId

提前致谢。

【问题讨论】:

  • GROUP BY 和 group_concat(?, 或类似的。)

标签: php sql sqlite


【解决方案1】:

尝试group_concat收集每组authorId中的所有contentId:

SELECT authors.authorId, GROUP_CONCAT(content.contentId)
FROM content
INNER JOIN content_authors
      ON content_authors.contentId = content.contentId
INNER JOIN authors
      ON content_authors.authorId = authors.authorId
GROUP BY authors.authorId

【讨论】:

    【解决方案2】:

    无需加入。你可以直接从bridge tablecontent_author得到你想要的结果:

    select authorid, group_concat(contentid) as contentids
    from content_author
    group by authorid
    

    【讨论】:

    • contentauthor 可能只包含桥接表中的子集...?例如authorcontent 中只有 1 行,但桥表中有很多行,在这种情况下,您的查询可能会返回很多行?
    • @mck:这样的模式通常具有从桥表到引用表的外键约束,因此桥表中没有“孤儿”记录。如果是这样,则保证查询返回与具有两个连接的解决方案相同的结果,当然,效率更高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2017-10-06
    • 2018-12-28
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多