我的表格按3列分组。在我的查询结果中,我需要按列分组中的两个的唯一组合计数。我可以使用子查询来完成这项工作。但是在大型数据集中,这使得查询需要很长时间才能运行。有没有办法在不使用子查询的情况下执行此操作?
这是一个例子。请提供下表group_test
。
+-------+--------+--------+
| A | B | C |
+-------+--------+--------+
| apple | orange | banana |
| apple | orange | grape |
| apple | pear | banana |
| kiwi | orange | banana |
+-------+--------+--------+
我想创建一个返回以下结果的查询。在A列和B列中有2行有苹果和橙色。如下所示:
+-------+--------+--------+----------+
| a | b | c | count_ab |
+-------+--------+--------+----------+
| apple | orange | banana | 2 |
| apple | orange | grape | 2 |
| apple | pear | banana | 1 |
| kiwi | orange | banana | 1 |
+-------+--------+--------+----------+
我可以使用子查询来完成此操作,如下所示:
SELECT
a, b, c,
(SELECT COUNT(DISTINCT c) FROM group_test g2 WHERE g2.a = g1.a AND g2.b = g1.b) AS count_ab
FROM
group_test g1
GROUP BY
a, b, c;
但正如我所说,这对大型数据集(100万+行)效率不高。我以为我可以这样做:
SELECT
a, b, c,
count(distinct a, b)
FROM
group_test g1
GROUP BY
a, b, c;
但这并不是我想要的结果。每行只返回1。
有什么想法吗?谢谢!
答案 0 :(得分:0)
这是您的查询:
SELECT a, b, c,
(SELECT COUNT(DISTINCT c)
FROM group_test g2
WHERE g2.a = g1.a AND g2.b = g1.b
) AS count_ab
FROM group_test g1
GROUP BY a, b, c;
在MySQL中,你加快速度的最大希望就是建立索引。我建议:
create index idx_group_test_a_b_c on group_test(a, b, c);
答案 1 :(得分:0)
通过避免SELECT列表中的相关子查询,以及对内联视图使用JOIN操作,可能会获得更好的性能,
SELECT t.a, t.b, t.c, s.cnt
FROM group_test g1
JOIN ( SELECT r.a, r.b, COUNT(*) AS cnt
FROM group_test r
GROUP BY r.a, r.b
) s
ON s.a = t.a AND s.b = t.b
GROUP
BY t.a, t.b, t.c
为获得最佳性能,您需要定义索引
... ON group_test (a, b, c)