2016-07-07 24 views
2

我有一張書籍表,一個作者表和一個「鏈接器」表(作者/書籍之間的多對多鏈接)。用於計算大多數圖書作者的SQL

如何找到書數最多的作者?

這是我的架構:

:ROWID,名

作者:ROWID,名

book_authors:ROWID,book_id,AUTHOR_ID

這是我想出了:(但它不工作)

SELECT count(*) IN book_authors 
WHERE (SELECT count(*) IN book_authors 
     WHERE author_id = author_id) 

而且我非常希望前100位作者的類似報告,東西:

author_name  book_count 
----------------------------------- 
Johnny   25 
Kelly   12 
Ramboz   10 

我需要某種加入?什麼是最快的方法?

+1

難道你不能僅僅通過Author_ID order by count(1)desc limit 100'選擇count(1),來自Book_Authors組的Author_ID,最多書籍的作者將位於頂部(或author_ID至少)限制到前100 ...然後添加限制子句http://stackoverflow.com/questions/3325515/sqlite-limit-offset-query – xQbert

+1

我想@Mureinik也有一個符合你想要的結果的有效答案。同樣有效,他會盡快發佈。另外,它加入到其他表中,以返回您想要的結果,並允許您根據需要添加這些表中的其他列。它會稍微慢一點,因爲它必須處理連接,但它會返回所要求的內容。 – xQbert

+0

如果您沒有book/author表中的rowID索引和book_authors中的Author_ID,Book_ID a索引,則顯着較慢的唯一原因是。或者你真的有數百萬的記錄在表格中。 – xQbert

回答

3

我想加盟三個表(通過book_authors表),組由作者,計數事件和限制它的前100行:

SELECT a.name, COUNT(*) 
FROM  authors a 
JOIN  books_authors ba ON a.rowid = ba.author_id 
JOIN  books b ON ba.book_id = b.rowid 
GROUP BY a.name 
ORDER BY 2 DESC 
LIMIT 100 

編輯:
其實,我們不是活得利用books任何數據,只是事實的書確實存在,這可以從books_authors推斷,所以這個查詢可以通過刪除第二要改善的T加入:

SELECT a.name, COUNT(*) 
FROM  authors a 
JOIN  books_authors ba ON a.rowid = ba.author_id 
GROUP BY a.name 
ORDER BY 2 DESC 
LIMIT 100 
+0

我認爲只需要一個「極限100」。 – xQbert

+0

@xQbert在我發佈我的答案後,這個要求被編輯到問題中。只是自己注意到它,並編輯它,但感謝您也指出了它。 – Mureinik

+0

什麼是a.name?是books.name? –

1

你不能只是

select count(1) , Author_ID from Book_Authors group by Author_ID order by count(1) desc limit 100

最書的作者是在頂部(或AUTHOR_ID將至少)

至於限制頂部100 ......再加入限制條款Sqlite LIMIT/OFFSET query

+0

感謝您的好評!它比Mureinik的快許多倍! –