Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql按列对3个分组中的2个不同行进行计数_Mysql_Group By - Fatal编程技术网

Mysql按列对3个分组中的2个不同行进行计数

Mysql按列对3个分组中的2个不同行进行计数,mysql,group-by,Mysql,Group By,我的表按3列分组。在查询的结果中,我需要这些GROUPBY列中的两个的唯一组合的计数。我可以使用子查询来实现这一点。但是,在大型数据集中,这使得查询需要很长时间才能运行。有没有不使用子查询就可以做到这一点的方法 这里有一个例子。给出下表“分组测试” 我想创建一个返回以下结果的查询。A列和B列中有两行有苹果和橙色。如下所示: +-------+--------+--------+----------+ | a | b | c | count_ab | +-------+

我的表按3列分组。在查询的结果中,我需要这些GROUPBY列中的两个的唯一组合的计数。我可以使用子查询来实现这一点。但是,在大型数据集中,这使得查询需要很长时间才能运行。有没有不使用子查询就可以做到这一点的方法

这里有一个例子。给出下表“分组测试”

我想创建一个返回以下结果的查询。A列和B列中有两行有苹果和橙色。如下所示:

+-------+--------+--------+----------+
| 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)