mysql子查询计数与查询计数不同

4ioopgfo  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(389)

这个问题在这里已经有答案了

如何在mysql中返回pivot表输出(9个答案)
两年前关门了。
使用此查询时:

SELECT channels.name, COUNT(places.id) AS 'free' FROM places INNER JOIN channels ON places.channelId = channels.id WHERE state = 'free' GROUP BY channelId;

结果是:

---------------
| name | free |
---------------
|  foo |    1 |
|  bar |    2 |
---------------

这一个给出了总的位置数:

SELECT channels.name, COUNT(places.id) AS 'total' FROM places INNER JOIN channels ON places.channelId = channels.id GROUP BY channelId;

结果如下:

----------------
| name | total |
----------------
|  foo |     3 |
|  bar |     4 |
----------------

你有办法得到这个结果吗

-----------------------
| name | free | total |
-----------------------
|  foo |    1 |     3 |
|  bar |    2 |     4 |
-----------------------

我还有一个问题:在第一个查询中,如果没有可用的位置,那么通道的行将不会出现:如果第一个查询中的通道foo没有可用的位置,那么结果的示例。

---------------
| name | free |
---------------
|  bar |    2 |
---------------

有什么好主意可以提出这个完美的问题吗?有可能吗?

wi3ka0sx

wi3ka0sx1#

可以使用条件聚合,比如

SELECT c.name, 
COUNT(p.id) AS total ,
SUM(state = 'free') AS free -- SUM(CASE WHEN state = 'free' THEN 1 ELSE 0 END)
FROM places  p
INNER JOIN channels c ON p.channelId = c.id 
GROUP BY c.name;

在mysql中使用表达式时 sum(a= b) 它的结果是一个布尔值0/1,因此您可以使用上面的

相关问题