0

著者と本の2つのテーブルがあるとします。各著者は、著者テーブルのidフィールドにリンクされているbookテーブルのauthorId列で識別される複数の本を持つことができます。

特定のカテゴリIDを持つすべての本を取得したいのですが、各本について、著者の名前と写真のURLを本のタイトルの横に表示したいと思います。

だから私はこのようなクエリを行います:

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

問題は、著者がそのカテゴリに複数の本を持っている場合はどうなるかということです。(たとえば、フィクション作家は複数のフィクション本を書きます)。その場合、著者の情報は行ごとに個別にフェッチされるため、重複する情報がフェッチされますか、それともDISTINCT、著者の情報が1回だけフェッチされるように使用するなどの方法はありますか?

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

はい、作者に重複が返されますが、それが問題になるとは思いません。別の方法として、代わりに2つのクエリを作成することもできます。1つは本用、もう1つは著者用で、コードでは、の結果間に
関係を設定します(DataSetまたはを使用して) 。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

元のクエリ(修正済み):

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

あなたが要求したことを正確に実行します。カテゴリ3の本ごとに、著者の名前と写真のURLとともに1行が返されます。

これを2つの結果セットに分割できます。

--
-- 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
             )

各本をその著者に一致させるのはあなた次第ですが、あなたはそれを選択します。最初の結果セットには、作成者の主キーが含まれている必要があります。2番目の作成者テーブルへの外部キー。

于 2012-08-20T19:31:35.627 に答える
-1

あなたはグループ連結を使うことができます:

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 に答える