一尘不染

如何计算表中每个外键ID的实例数?

mysql

这是我简单的SQL问题…

我有两个表:

图书

-------------------------------------------------------
| book_id | author | genre | price | publication_date |
-------------------------------------------------------

命令

------------------------------------
| order_id | customer_id | book_id |
------------------------------------

我想创建一个查询,返回:

--------------------------------------------------------------------------
| book_id | author | genre | price | publication_date | number_of_orders |
--------------------------------------------------------------------------

换句话说,返回“书籍”表中 所有 行的每一列,以及一个计算得出的名为“
number_of_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上运行,因此我不能使用任何其他供应商特定的功能)。

提前致谢!


阅读 282

收藏
2020-05-17

共1个答案

一尘不染

您的查询几乎是正确的,这是正确的方法(也是最有效的方法)

SELECT books.*, count(orders.book_id) as number_of_orders        
from books
left join orders
on (books.book_id = orders.book_id)
group by
    books.book_id

COUNT(*)可能在计数中包含NULL值,因为它对所有行进行计数,而COUNT(orders.book_id)没有因为它忽略给定字段中的NULL值。

2020-05-17