Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何计算表中每个外键ID的实例数?_Mysql_Sql - Fatal编程技术网

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

Mysql 如何计算表中每个外键ID的实例数?,mysql,sql,Mysql,Sql,下面是我的简单SQL问题 我有两张桌子: 书 命令 ------------------------------------ | order_id | customer_id | book_id | ------------------------------------ 我想创建一个查询,返回: -------------------------------------------------------------------------- | book_id | author | gen

下面是我的简单SQL问题

我有两张桌子:

命令

------------------------------------
| 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;