Mysql按列对3个分组中的2个不同行进行计数
我的表按3列分组。在查询的结果中,我需要这些GROUPBY列中的两个的唯一组合的计数。我可以使用子查询来实现这一点。但是,在大型数据集中,这使得查询需要很长时间才能运行。有没有不使用子查询就可以做到这一点的方法 这里有一个例子。给出下表“分组测试” 我想创建一个返回以下结果的查询。A列和B列中有两行有苹果和橙色。如下所示:Mysql按列对3个分组中的2个不同行进行计数,mysql,group-by,Mysql,Group By,我的表按3列分组。在查询的结果中,我需要这些GROUPBY列中的两个的唯一组合的计数。我可以使用子查询来实现这一点。但是,在大型数据集中,这使得查询需要很长时间才能运行。有没有不使用子查询就可以做到这一点的方法 这里有一个例子。给出下表“分组测试” 我想创建一个返回以下结果的查询。A列和B列中有两行有苹果和橙色。如下所示: +-------+--------+--------+----------+ | a | b | c | count_ab | +-------+
+-------+--------+--------+----------+
| 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;
但正如我所说的,对于一个超过一百万行的大型数据集来说,这是没有效率的。我想我可以这样做:
SELECT
a, b, c,
count(distinct a, b)
FROM
group_test g1
GROUP BY
a, b, c;
但这并不是我想要的结果。每行只返回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;
在MySQL中,提高速度的最大希望是索引。我建议:
create index idx_group_test_a_b_c on group_test(a, b, c);
通过避免选择列表中的相关子查询,并改为使用内联视图的联接操作,可以获得更好的性能
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)
这种方法比子查询执行得更好。
... ON group_test (a, b, c)