2011-03-20 53 views
1

鑑於下列表格,我想知道如何編寫查詢以僅返回其中包含書籍的類別以及每個類別的書籍數量。一本書可以添加一個或多個類別。我使用PHP和MySQL。有關MySQL查詢的幫助

這裏是我的表:

類別表
- ID
- 姓名
- 永久

書表
- ID
- 標題
- 作者
- 描述
- 價格

books_categories表
- ID
- book_id
- CATEGORY_ID

回答

5
select c.id 
     ,c.name 
     ,count(*) as num_books 
    from categories c 
    join books_categories bc on(bc.category_id = c.id) 
group 
    by c.id 
     ,c.name; 

使用LEFT JOIN如果你也想的類別沒有書籍。

+0

使用可讀別名進行計數(*) – markus 2011-03-20 11:32:43

+1

我認爲對SQL部分使用大寫字母會使查詢更好地閱讀。我允許自己編輯它。 – markus 2011-03-20 11:38:51

+0

大寫關鍵字變得毫無用處和浪費,其次我們獲得了彩色屏幕和語法高閃電。我回到了我個人的口味。 – Ronnis 2011-03-20 12:37:36

2
SELECT *, COUNT(*) AS count 
FROM books_categories AS bc 
LEFT JOIN categories AS c ON c.id = bc.category_id 
GROUP BY c.id 

你會得到一個count柱行對每個類別的數量。零書類別(即沒有表格books_categories中的條目)將不會被退回。

+0

我認爲你把表放錯了順序(或者你的意思是正確的加入)。 – Ronnis 2011-03-20 11:31:37

+0

@羅尼斯,我不這麼認爲。我使用這樣的查詢,他們工作正常。只要我只想分配一些圖書的類別,這就行了。 – Czechnology 2011-03-20 11:35:24

+0

您的查詢與您的描述不符。零書類別不會包含在您的結果中。要解決這個問題,你需要使用RIGHT JOIN(如果mysql支持它)或者改變表的順序。實際上,除非缺少RI約束和垃圾數據,否則您的查詢與內部連接相同。 – Ronnis 2011-03-20 12:49:21

1
SELECT categories.id, 
    COUNT(books_categories.id) AS number 
FROM categories 
    LEFT JOIN books_categories ON books_categories.category_id = categories.id 
GROUP BY categories.id 
HAVING number > 0;