2012-02-23 22 views
0

与えられた著者によって書かれた本の本数を教えてくれるSQLステートメントを作成したいと思います。 SQLiteの特定の外部キーからのカウントを選択

あなたはauthorid(booksテーブルへの外部キー)を知っている

それは簡単です:

select count(*) from books where authorid = 25; 
15 

あなたは15冊の本を書かれたID 15とその作者を見ることができます。出力は次のようにすべての作者のためのステートメントを作成することは可能ですか?

author_id, author_name, number_of_books 
1   Michael  15 
2   Robin  7 
... 

答えて

2

あなたはgroup by句でこれを行うことができます:

select 
    a.author_id, 
    a.author_name, 
    count(*) as number_of_books 
from 
    authors a inner join 
    books b on b.author_id = a.author_id 
group by 
    a.author_id, 
    a.author_name 
order by 
    number_of_books 
+0

私は別の答えでなぜ「内部結合」と尋ねられました。これは私に言われたので、ここに貼り付けます。 '今日のほとんどのSQLデータベースでは、JOINはINNER JOINの同義語です。私は冗長ではっきりしたフルネームを好む。 – xralf

+0

小さな質問を1つお願いしますか? number_of_booksの「注文する」ことは可能ですか?私は 'group by'でこのエラーを試しました。' Error:GROUP BY句に集約関数は許されません 'と' error by:near group ':syntax error'というエラーで 'order by'で試しました。それが可能であれば素晴らしいだろう。 – xralf

+0

@xralf私は自分の答えを 'order by'を含めて更新しました。 –

2

これは、クエリのGROUP BYのようになります。必ずbooks.author_idことを確認、また

select author_id, author_name, count(*) as number_of_books 
    from books 
    join author on books.author_id = author.id 
    group by author_id, author_name; 
+0

そうだね。どうして私はそれを使わないで文を使った 'as number_of_books'があるのですか? – xralf

+0

'number_of_books'はその名前を出力列に与えます。 – stuartd

+0

私はそれを考えましたが、見出しは表示されませんでした。たぶんそれは別のDBMSにあります。 – xralf

1
SELECT 
    books.author_id, authors.author_name, COUNT(books.author_id) AS number_of_books 
FROM 
    authors INNER JOIN books ON books.author_id = authors.id 
GROUP BY 
    author_name; 

列がNULLでないと、パフォーマンスが低下します。

+0

これは他の答えよりも正確ですが、なぜ 'count'の代わりに' join'と 'sum'の代わりに' inner join'を使ったのですか?ここには意味がありますか? @Stuartはそれを使用していないし、それも動作します。 – xralf

+1

今日のほとんどのSQLデータベースでは、 'JOIN'は' INNER JOIN'の同義語です。私は冗長ではっきりしたフルネームを好む。 SUMについては、この場合count(*)が同じ結果を出す場合でも、書籍の合計が必要です。繰り返しますが、これは明確に名づけられています。あなたは今からコードの年を維持しているとき、あるいは他の誰かがそうであるとき、この明快さに感謝するでしょう! – dotancohen

+0

SUM(books.author_id)はすべての著者IDを*追加する予定ですか? – stuartd

関連する問題