mysql - MAX与Count相减

标签 mysql sql

我想知道一位作者的最大图书数量与每位作者的图书数量之差。

SELECT  count(book_name) contar, (MAX(C.qty) - count(book_name)) final
FROM (select B.author_id, count(book_name) qty 
     FROM author A ,BOOK B 
     WHERE A.author_id = B.author_id 
     GROUP BY b.author_id) C , 
author A, 
BOOK B 
WHERE A.author_id = B.author_id 
    AND B.author_id=C.Author_id
    AND date_release BETWEEN NOW() - INTERVAL 20 YEAR AND NOW()
GROUP BY c.author_id
HAVING contar > 0

如您所见,有两个表 BOOK,其中包含 book_idauthor_idbook_namedate_release 和表 AUTHOR author_idauthor_nameauthor_lastnamedate_birth .

我得到了这个结果

results

但是我需要类似的东西

--------+-------+--+
| contar | final |  |
+--------+-------+--+
|      1 |    -4 |  |
|      2 |    -3 |  |
|      5 |     0 |  |
|      1 |    -4 |  |
+--------+-------+--+ 

最佳答案

问题是 MAX(C.qty) 是按作者计算的,因为查询有 GROUP BY c.author_id。您只需为整个子查询计算一次总数。

在获取每个作者的书籍数量时,也不需要加入 AUTHOR,因为作者 ID 在 BOOK 中。

SELECT  count(book_name) contar, (max_qty - count(book_name)) final
FROM (SELECT MAX(qty) AS max_qty
      FROM (select count(book_name) qty 
            FROM BOOK B 
            GROUP BY b.author_id) t
     ) C 
CROSS JOIN author A
JOIN book B ON A.author_id = B.author_id 
WHERE date_release BETWEEN NOW() - INTERVAL 20 YEAR AND NOW()
GROUP BY A.author_id

并且不需要 HAVING contar > 0,因为没有书籍的作者将不会包含在 JOIN 中。

关于mysql - MAX与Count相减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41230307/

相关文章:

c# - 如何在不执行 Queryable 的情况下以通用方式替换 Queryable<T> 中的列

mysql - 怎么超过1000 :00:00 time sum using mysql

sql - 仅还原 SQL 数据库数据

mysql - 为什么 IN() 子句影响一行?

c# - 如何使用键连接将值插入 SQL 字段

java - 如何在 Spring JDBC 中回滚事务?

php - 为数据库中的每个 ID 维护一个字符串队列

mysql - 从 Rails Schema 生成模型

python - 在 python 中运行 mySql 命令

javascript - 使用 AngularJS 和 NodeJS 从 MySQL 中检索数据