如何在组查询中子查询SQLite?
为这个草率的标题道歉,我想不出一个更简洁的表达方式 我搜索过这个问题,发现有人在谈论它,但这些例子都是简单的查询,目的是检索单数值,或者超出我的理解范围。如果有人能告诉我怎么才能干净利落地做到这一点,我将不胜感激 桌子的布置很简单 书如何在组查询中子查询SQLite?,sql,sqlite,Sql,Sqlite,为这个草率的标题道歉,我想不出一个更简洁的表达方式 我搜索过这个问题,发现有人在谈论它,但这些例子都是简单的查询,目的是检索单数值,或者超出我的理解范围。如果有人能告诉我怎么才能干净利落地做到这一点,我将不胜感激 桌子的布置很简单 书 ID int 标题str 备用标题 图书情报 标题str 标签 ID int 标签str 书籍和标签 图书情报 标记int 作者 ID int 名称int 书籍与作者 图书情报 作者ID int 我试图编写的查询将产生如下结果 Title,
- ID int
- 标题str
- 图书情报
- 标题str
- ID int
- 标签str
- 图书情报
- 标记int
- ID int
- 名称int
- 图书情报
- 作者ID int
Title, Author, Tags, Alternate_Titles
"Star Wars","George Lucas","sci-fi,70s,adventure","Star Wars: Episode IV, A New Hope"
问题是alternate_title.title值可以包含逗号<代码>组_CONCAT不能指定不同的分隔符字符串,同时也具有不同的
。因此,我要么得到一个无法在客户端应用程序中拆分的值,要么得到一个包含许多副本的值(因为一本书可能有5个备用标题)
解决方案是编写一个SELECT子查询,但我一辈子都不知道如何为这种情况编写一个,因为我已经连接了多个表。。。我发现的例子,我不能适用于我自己的例子
我该怎么办?您可以使用相关子查询:
SELECT b.Title,
(SELECT GROUP_CONCAT(a.Name)
FROM Books_Authors ba JOIN
Authors a
ON ba.Authors_ID = a.ID
WHERE b.ID = ba.Books_ID
) as authors,
(SELECT GROUP_CONCAT(alt.Title, '^SEP^') -- Should be DISTINCT
FROM ALternate_Titles alt
WHERE b.ID = alt.Books_ID
) as alternate_titles,
(SELECT GROUP_CONCAT( t.Label)
FROM Books_Tags bt JOIN
Tags t
ON bt.Tags_ID = t.ID
WHERE b.ID = bt.Books_ID
) as tags
FROM Books b ;
是一个SQL Fiddle。您可以在
备用标题
和已连接的书籍标签
和标签
中预聚合,而不是合并所有表,然后进行聚合,最后合并结果,因此不存在重复项,您可以在GROUP_CONCAT()中使用分隔符参数
:
查看
标签中的(3,'浪漫')
而不是(2,'浪漫')
和(2,3)
而不是书籍标签中的第二个(2,2)
。
在你的小提琴中,我猜(2,'浪漫'
应该是(3,'浪漫')
,在书籍标签中,第二个(2,2)
应该是(2,3)
。
SELECT b.Title, a.Name, titles, labels
FROM Books b
JOIN Books_Authors ba ON b.ID = ba.Books_ID
JOIN Authors a ON ba.Authors_ID = a.ID
JOIN (
SELECT Books_ID, GROUP_CONCAT(Title, '^SEP^') titles
FROM Alternate_Titles
GROUP BY Books_ID
) at ON b.ID = at.Books_ID
JOIN (
SELECT bt.Books_ID, GROUP_CONCAT(t.Label, '^SEP^') labels
FROM Books_Tags bt JOIN Tags t
ON bt.Tags_ID = t.ID
GROUP BY bt.Books_ID
) t ON b.ID = t.Books_ID