加入时如何在多行中保留多个值?

时间:2018-06-20 16:18:31

标签: sql sqlite

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

说我有一张桌子:

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

我想做的是发出一个select查询,该查询返回一本书的列表,一本书的可用格式的列表以及每种格式的大小。为了说明这一点,如果我将结果转换为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。

1 个答案:

答案 0 :(得分:0)

您正在寻找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,因此分隔符是临时的。