[英]mysql: union re-use subquery
这里有张桌子:
ID City
1 Toronto
2 Toronto
3 Toronto
4 Toronto
5 NY
6 NY
如何获得下表:
City Total
NULL 6
Toronto 4
NY 2
我打算使用union
:
(select city, count(*) as total from tbl group by city)
union
(select null, count(*) as total from tbl)
是否可以使用类似重用子查询的方法:
(select city, count(*) as total from tbl group by city) tmp
union
(select null, count(*) as tmp from tbl)
或者 sql 已经优化
(select city, count(*) as total from tbl group by city)
union
(select null, count(*) as total from tbl)
?
至少在 MySQL 5.5 和更高版本中,您可以使用WITH ROLLUP
修饰符来获取分组元素的总和,而无需额外查询;
SELECT city, COUNT(*) AS total FROM tbl GROUP BY city WITH ROLLUP
city total
---------------
NY 2
Toronto 4
(null) 6
您不能重用查询,但可以使用视图重用代码
create view my_view as
select city, count(*) as total
from tbl group by city
一旦创建了视图,您就可以
select city, total
from my_view
union
select null, sum(total)
from my_view
1) 取别名只对加入成员和子查询可见。 不适用于工会成员。
2)您编写的查询几乎没有意义:将 tmp 别名为表然后是标量?
要实现您想要实现的目标,您可以尝试使用 CTE:
WITH tmp AS (SELECT city, COUNT(*) AS cnt GROUP BY city)
SELECT * FROM tmp UNION SELECT null, SUM(cnt) FROM tmp
我不知道性能差异会是什么。 如果您有关于city
的索引,我怀疑您会看到不同。
您在子查询中使用WITH ROLLUP
,然后在外部查询中安排排序以将汇总记录放在首位:
SELECT *
FROM (SELECT city, COUNT(*) AS total FROM mytable GROUP BY city WITH ROLLUP) x
ORDER BY
CASE WHEN city IS NULL THEN 0 ELSE 1 END,
city
如果您打算按总计降序排列结果,那就更简单了:
SELECT *
FROM (SELECT city, COUNT(*) AS total FROM mytable GROUP BY city WITH ROLLUP) x
ORDER BY total DESC
| city | total |
| ------- | ----- |
| | 6 |
| Toronto | 4 |
| NY | 2 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.