这是我简单的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上运行,因此我不能使用任何其他供应商特定的功能)。
提前致谢!
您的查询几乎是正确的,这是正确的方法(也是最有效的方法)
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值。
COUNT(*)
COUNT(orders.book_id)