繁体   English   中英

mysql:联合重用子查询

[英]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

一个用于测试的 SQLfiddle

您不能重用查询,但可以使用视图重用代码

  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

DB Fiddlde 上的演示

| city    | total |
| ------- | ----- |
|         | 6     |
| Toronto | 4     |
| NY      | 2     |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM