下面是我的简单SQL问题...
我有两张table:
书籍
-------------------------------------------------------
| book_id | author | genre | price | publication_date |
-------------------------------------------------------
订单
------------------------------------
| order_id | customer_id | book_id |
------------------------------------
我想创建一个查询,返回:
--------------------------------------------------------------------------
| book_id | author | genre | price | publication_date | number_of_orders |
--------------------------------------------------------------------------
换句话说,返回Books表中ALL行的每一列,沿着一个名为'number_of_orders'的计算列,该计算列计算每本书在Orders表中出现的次数。(如果某本书没有出现在Orders表中,则该书应该列在结果集中,但“number_of_orders”应该为零。
到目前为止,我得出了这个结论:
SELECT
books.book_id,
books.author,
books.genre,
books.price,
books.publication_date,
count(*) as number_of_orders
from books
left join orders
on (books.book_id = orders.book_id)
group by
books.book_id,
books.author,
books.genre,
books.price,
books.publication_date
这几乎是正确的,但还不完全正确,因为即使一本书从未在Orders表中列出,“number_of_orders”也将是1。此外,考虑到我对SQL的缺乏知识,我敢肯定这个查询是非常低效的。
编写这个查询的正确方法是什么?(不管怎样,这需要在MySQL上工作,所以我不能使用任何其他特定于供应商的特性)。
5条答案
按热度按时间t98cgbkg1#
您的查询几乎是正确的,这是正确的方法(也是最有效的方法)
COUNT(*)
可以在计数中包含NULL值,因为它对所有行进行计数,而COUNT(orders.book_id)
不包含NULL值,因为它忽略给定字段中的NULL值。dbf7pr2w2#
hi3rlvi23#
将
count(*)
更改为count(orders.book_id)
cnwbcb6i4#
你数错了,你想数非空的book_id。
kkih6yb85#