如何在组查询中子查询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