【问题标题】:How to preserve multiple values in multiple rows when joining?加入时如何在多行中保留多个值?
【发布时间】:2018-06-20 16:18:31
【问题描述】:

我为标题道歉,但我真的想不出一个更清晰的标题。

假设我有一桌书:

id | title
---|------------
1  | Childhood's End
2  | Annihilation
3  | The Light of Other Days

还有一个跟踪与每本书关联的文件的表格,因为电子书可以以多种格式存在:

id | format | book_id | size
---|--------|---------|---------
1  | EPUB   | 1       | 207 KB
2  | PDF    | 1       | 409 KB
3  | MOBI   | 1       | 310 KB
4  | EPUB   | 2       | 773 KB
5  | MOBI   | 3       | 1020 KB

我想做的是发出一个选择查询,该查询返回书籍列表、该书籍可用的格式列表以及每种格式的大小。为了说明,如果我将结果转换为 JSON,我的目标是

[
    {
        "title": "Childhood's End",
        "formats": [
            { "format": "EPUB", "size": "207 KB" },
            { "format": "PDF",  "size": "409 KB" },
            { "format": "MOBI", "size": "310 KB" }]
    }
]

我知道我可以使用 group_concat 将连接表中的多行与“初始”表中的一行相关联,这样 book_id 1 可以在结果中有一个带有 "EPUB,PDF,MOBI" 的字段,只是一个逗号分隔细绳。我不知道我是否可以,如果可以,我将如何选择两个值,并保持关联。

是否可以通过单个 SQL 查询检索所有这些信息?是否需要使用选择子查询?如果需要,效率会非常低吗?

我问的是一般的 SQL,但如果特定系统很重要,则需要 SQLite。

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    您正在寻找group_concat():

    select b.id, b.title, group_concat(f.format || '-' || f.size, ',') as formatsizes
    from books b join
         files f
         on f.book_id = b.id
    group by b.id, b.title;
    

    这显然不会产生 JSON,所以分隔符是临时的。

    【讨论】:

    • 谢谢你,我不知道group_concat() 可以这样工作,这正是解决它的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2021-09-08
    • 1970-01-01
    相关资源
    最近更新 更多