鑑於下列表格,我想知道如何編寫查詢以僅返回其中包含書籍的類別以及每個類別的書籍數量。一本書可以添加一個或多個類別。我使用PHP和MySQL。有關MySQL查詢的幫助
這裏是我的表:
類別表
- ID
- 姓名
- 永久
書表
- ID
- 標題
- 作者
- 描述
- 價格
books_categories表
- ID
- book_id
- CATEGORY_ID
鑑於下列表格,我想知道如何編寫查詢以僅返回其中包含書籍的類別以及每個類別的書籍數量。一本書可以添加一個或多個類別。我使用PHP和MySQL。有關MySQL查詢的幫助
這裏是我的表:
類別表
- ID
- 姓名
- 永久
書表
- ID
- 標題
- 作者
- 描述
- 價格
books_categories表
- ID
- book_id
- CATEGORY_ID
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
如果你也想的類別沒有書籍。
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中的條目)將不會被退回。
我認爲你把表放錯了順序(或者你的意思是正確的加入)。 – Ronnis 2011-03-20 11:31:37
@羅尼斯,我不這麼認爲。我使用這樣的查詢,他們工作正常。只要我只想分配一些圖書的類別,這就行了。 – Czechnology 2011-03-20 11:35:24
您的查詢與您的描述不符。零書類別不會包含在您的結果中。要解決這個問題,你需要使用RIGHT JOIN(如果mysql支持它)或者改變表的順序。實際上,除非缺少RI約束和垃圾數據,否則您的查詢與內部連接相同。 – Ronnis 2011-03-20 12:49:21
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;
使用可讀別名進行計數(*) – markus 2011-03-20 11:32:43
我認爲對SQL部分使用大寫字母會使查詢更好地閱讀。我允許自己編輯它。 – markus 2011-03-20 11:38:51
大寫關鍵字變得毫無用處和浪費,其次我們獲得了彩色屏幕和語法高閃電。我回到了我個人的口味。 – Ronnis 2011-03-20 12:37:36