2012-02-23 52 views
0

具體的外鍵選擇計數我想創建一個SQL語句會告訴我有多少書,其中由給定的作者所寫。從SQLite中

當你知道AUTHORID(外鍵books表)很容易:

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

你可以看到,作者ID爲15寫過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 2012-02-23 16:45:46

+0

我可以問一個更小的問題嗎?是否可以通過number_of_books命令?我用'group by'試着用這個錯誤'錯誤:在GROUP BY子句中不允許使用聚合函數',並且使用'order by'這個錯誤'Error:near「group」:syntax error' ... ...但它如果可能的話,會很棒。 – xralf 2012-02-23 16:56:15

+0

@xralf我已經更新了我的答案,包括'order by'。 – 2012-02-23 17:24:25

2

這將是一個GROUP BY查詢:

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

似乎工作。爲什麼有'作爲number_of_books'我沒有它使用了陳述。 – xralf 2012-02-23 15:59:39

+0

'as number_of_books'將該名稱輸出到輸出列。 – stuartd 2012-02-23 16:19:18

+0

我以爲它,但標題沒有顯示。也許它在另一個DBMS中。 – xralf 2012-02-23 16:32:41

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; 

此外,還要確保books.author_id列不是NULL,否則性能將受損。

+0

這似乎比其他答案更精確,但爲什麼你用'inner join'而不是'join'和'sum'而不是'count'。這裏有意思嗎? @Stuart沒有使用它,它也可以工作。 – xralf 2012-02-23 16:01:54

+1

今天在大多數SQL數據庫中,'JOIN'是'INNER JOIN'的同義詞。我更喜歡冗長而明確的全名。至於SUM,即使計數(*)在這種情況下會產生相同的結果,您也需要一筆書本。再次,這是爲了澄清。當你從現在開始維護代碼或者其他人的時候,你會明白這一點。 – dotancohen 2012-02-23 16:06:59

+0

SUM(books.author_id)是否將*加起來*所有作者ID? – stuartd 2012-02-23 16:21:03