我为标题感到抱歉,但我真的想不出一个更清晰的标题。
说我有一张桌子:
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。
答案 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,因此分隔符是临时的。