以此表为例(我们称之为BIN_TABLE
):
+------+------+
| A | B |
+------+------+
| 0 | 0 |
| 0 | 1 |
| 1 | 1 |
| 1 | 0 |
+------+------+
我想把它卷起来,所以我这样做:
SELECT A, B, COUNT(*)
FROM BIN_TABLE
GROUP BY A, B WITH ROLLUP;
我得到了:
+------+------+----------+
| A | B | COUNT(*) |
+------+------+----------+
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 0 | NULL | 2 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
| 1 | NULL | 2 |
| NULL | NULL | 4 |
+------+------+----------+
这是WITH ROLLUP
如何使用我在GROUP BY
子句中输入的字段顺序的示例。
我想在结果中也有以下几行:
| NULL | 1 | 2 |
| NULL | 0 | 2 |
这意味着我拥有所有卷起的排列。
这可不做到这一点:
SELECT A, B, COUNT(*)
FROM BIN_TABLE
GROUP BY A, B WITH ROLLUP
UNION
SELECT NULL, B, COUNT(*)
FROM BIN_TABLE
GROUP BY B
(我使用MySQL 5.6,如果重要的话)
答案 0 :(得分:1)
不,我相信UNION
是唯一的方法。但是,您可以使用UNION ALL
(而不是隐式UNION DISTINCT
)来避免不必要地搜索重复项。
答案 1 :(得分:-1)
根据汇总修改器的功能,您的结果中已经存在所有汇总排列。
请查看这些结果。
+------+------+----------+
| A | B | COUNT(*) |
+------+------+----------+
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 0 | NULL | 2 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
| 1 | NULL | 2 |
| NULL | NULL | 4 |
+------+------+----------+
此处,第3条记录和第6条记录是汇总排列 所以我们可以通过以下的sql获得结果。
SELECT * from
(select a,b,count(*) from
bin_table group by a,b with rollup) total
order by total.b desc,a;
+------+------+----------+
| a | b | count(*) |
+------+------+----------+
| 0 | 1 | 1 |
| 1 | 1 | 1 |
| 0 | 0 | 1 |
| 1 | 0 | 1 |
| NULL | NULL | 4 |
| 0 | NULL | 2 |
| 1 | NULL | 2 |
+------+------+----------+
7 rows in set (0.01 sec)
此处,第6条记录和第7条记录是汇总排列。 我认为它会使性能更好。
谢谢,