Mysql 如何计算表中每个外键ID的实例数?
下面是我的简单SQL问题 我有两张桌子: 书 命令Mysql 如何计算表中每个外键ID的实例数?,mysql,sql,Mysql,Sql,下面是我的简单SQL问题 我有两张桌子: 书 命令 ------------------------------------ | order_id | customer_id | book_id | ------------------------------------ 我想创建一个查询,返回: -------------------------------------------------------------------------- | book_id | author | gen
------------------------------------
| order_id | customer_id | book_id |
------------------------------------
我想创建一个查询,返回:
--------------------------------------------------------------------------
| book_id | author | genre | price | publication_date | number_of_orders |
--------------------------------------------------------------------------
换句话说,返回Books表中所有行的每一列,以及一个名为'number\u of_orders'的计算列,该列计算每本书在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表中列出,“订单数量”也将是1。此外,鉴于我缺乏SQL知识,我确信这个查询效率很低
编写此查询的正确方法是什么?(值得一提的是,它需要在MySQL上工作,因此我不能使用任何其他特定于供应商的功能)
提前感谢!将
count(*)
更改为count(orders.book\u id)
您的查询几乎正确,这是正确的方法(也是最有效的)
COUNT(*)
可能会在计数中包含空值,因为它会对所有行进行计数,而COUNT(orders.book\u id)
不会包含空值,因为它会忽略给定字段中的空值。您的计数错误。您想对非空的book\u id进行计数
SELECT
books.book_id,
books.author,
books.genre,
books.price,
books.publication_date,
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,
books.author,
books.genre,
books.price,
books.publication_date
您的上一条语句可能有点误导。COUNT函数本身在聚合数据时忽略空值。原因是COUNT(*)这里返回的计数错误是因为它计数的是行,而不是特定的列OP@Fabio为了计算其他表中的相关条目,此特定查询的名称是什么?它有学术名称吗?@KamalReddy AFAIK此类查询在学术界没有任何特定名称。@Fabio谢谢为此,我不明白join是如何与()语句一起工作的。您是否能够对此提供一些说明、文献或示例?PostgreSQL要求我在group语句中包含我选择的每个字段。
ERROR:column“…”必须出现在GROUP BY子句中或用于聚合函数
关于如何解决它的任何想法?(除了实际执行它要求我做的事情)
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
SELECT
books.book_id,
books.author,
books.genre,
books.price,
books.publication_date,
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,
books.author,
books.genre,
books.price,
books.publication_date
SELECT b.book_id,
b.author,
b.genre,
b.price,
b.publication_date,
coalesce(oc.Count, 0) as number_of_orders
from books b
left join (
select book_id, count(*) as Count
from Order
group by book_id
) oc on (b.book_id = oc.book_id)
select author.aname,count(book.author_id) as "number_of_books"
from author
left join book
on(author.author_id=book.author_id)
GROUP BY author.aname;