0

假设我有两张桌子,作者和书。每个作者可以拥有多本书,由 book 表的 authorId 列标识,该列链接到 author 表的 id 字段。

我想获取具有特定类别 ID 的所有书籍,并且对于每本书,我希望将作者的姓名和照片 url 显示在书名旁边。

所以我做了这样的查询:

SELECT author.name, author.photoUrl, book.title
    FROM author, book
    WHERE book.categoryId = '3' AND author.id = book.authorId

问题是,如果作者在该类别中有多本书怎么办?(例如,小说作家写了多本小说书)。在这种情况下,是否会为每一行单独获取作者的信息,从而获取重复的信息,或者是否有任何方法,例如使用DISTINCT这样一个作者的信息只获取一次?

4

4 回答 4

4

首先,您应该使用标准连接语法:

SELECT author.name, author.photoUrl, book.title
FROM author join
     book
     on author.id = book.authorId
WHERE book.categoryId = '3'

您所说的“重复”信息正是 SQL 在连接中所做的。这没有问题。如果您举例说明您想要返回的内容,那么可能有一种方法可以减少数据。

令我震惊的是,您可能想要作者的书籍列表,作为分隔列表。在这种情况下,试试这个:

SELECT author.name, author.photoUrl,
       group_concat(book.title separator ', ') as books
FROM author join
     book
     on author.id = book.authorId
WHERE book.categoryId = '3'
group by author.name, author.photoUrl
于 2012-08-20T18:34:57.527 回答
1

您的原始查询(已修复):

SELECT author.name     ,
       author.photoUrl ,
       book.title
FROM author
join book   on book.categoryId = '3'
               book.authorId   = author.id

完全按照您的要求执行:它将为类别 3 中的每本书返回一行,以及作者的姓名和照片 URL。

您可以将其分解为两个结果集:

--
-- retrieve category 3 books
-- 
select *
from book b
where b.category = 3

--
-- retrieve related author data
--
select *
from author a
where exists ( select *
               from book b
               where b.authorId = a.id
                 and b.category = 3
             )

现在由您决定将每本书与其作者匹配,但您可以选择这样做。第一个结果集应该带有作者的主键;第二个是作者表的外键。

于 2012-08-20T19:31:35.627 回答
1

是的,它会返回作者的重复项,但我认为这不是问题。
另一种方法是使用两个查询,一个针对书籍,一个针对作者,然后在代码中在结果之间建立关系(在 a 中DataSet或使用 a Dictionary<int, Author>AuthorId

图书

SELECT 
  book.title,
  book.authorId
FROM 
  book
WHERE 
  book.categoryId = '3'

作者

SELECT 
  author.Id,
  author.name, 
  author.photoUrl
FROM
  author
WHERE
  EXISTS(
     SELECT NULL
     FROM book
     WHERE 
       book.categoryId = '3' AND
       author.id = book.authorId
  )
于 2012-08-20T19:20:16.163 回答
-1

您可以使用组 concat

SELECT author.name, author.photoUrl, GROUP_CONCAT(DISTINCT title ORDER BY title SEPARATOR ',')
FROM author
    INNER JOIN book on author.id = book.authorId
WHERE book.categoryId = '3'
GROUP BY author.name

这将获取给定作者的所有标题并将它们作为逗号分隔的字符串返回。

于 2012-08-20T18:35:12.317 回答