Mysql在3个Group By列中的2个中计算不同的行数

时间:2014-08-07 20:00:22

标签: mysql group-by

我的表格按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。

有什么想法吗?谢谢!

2 个答案:

答案 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)