Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.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一次查询多次计数_Mysql_Sql_Aggregate Functions - Fatal编程技术网

Mysql一次查询多次计数

Mysql一次查询多次计数,mysql,sql,aggregate-functions,Mysql,Sql,Aggregate Functions,如何使用不同的查询条件计算一个表中两列的记录 表如下所示: user_id | date | status ------------------------------ 1 | 2011-01-02 | 1 2 | 2011-01-03 | 1 3 | 2011-01-02 | 0 4 | 2011-01-03 | 1 1 | 2011-01-02 | 1

如何使用不同的查询条件计算一个表中两列的记录

表如下所示:

   user_id  |   date     | status
------------------------------
      1     | 2011-01-02 |   1
      2     | 2011-01-03 |   1
      3     | 2011-01-02 |   0
      4     | 2011-01-03 |   1
      1     | 2011-01-02 |   1
我想在一个查询中计算两个值。第一个是按状态划分的用户id组数,第二个是按日期划分的用户id组数

我该怎么做呢?

你不需要

您应该使用两个查询。使用单个查询执行此操作没有任何好处

如果您真的想这样做,您可以尝试以下方法:

SELECT 'date' AS grptype, date AS grp, COUNT(DISTINCT user_id) AS cnt
FROM yourtable
GROUP BY date
UNION ALL
SELECT 'status' AS grptype, status AS grp, COUNT(DISTINCT user_id) AS cnt
FROM yourtable
GROUP BY status
结果:

grptype grp cnt date 2011-01-02 2 date 2011-01-03 2 status 0 1 status 1 3
然而,我强烈建议不要这样做。您需要两个不同且不相关的结果集,因此应使用两个单独的查询。

在同一查询中不能有不同的GROUP BY子句-每个计数必须在独立查询中

但您可以使用SELECT子句中的subselects subquery在单个查询/结果集中返回输出:

   SELECT COUNT(a.user_id) AS numUsersPerStatus,
          (SELECT COUNT(b.user_id)
             FROM YOUR_TABLE b
         GROUP BY b.date) AS numUsersPerDate
    FROM YOUR_TABLE a
GROUP BY a.status

使用类似“选择计数”的方法…请提供预期输出的示例,因为每个状态的计数与每个日期的计数没有关系。笛卡尔积是唯一的结果。按原样联合不起作用-日期和状态列是不同的数据类型。您可能希望将其用作派生表/内联视图,以便最终使用MAX压缩成更少的行。为什么不建议这样做?@rahmanisback:因为这是对SQL的滥用。每次在单个列中混合数据类型时,独角兽就会死亡。在大多数数据库中,这样的事情甚至是不允许的。MySQL由于类型转换而允许它。但这并不意味着你应该这样做。如果在Select列中使用子查询,它应该只返回1行和1列,numUsersPerDate将针对不同的日期返回多行?我认为这个查询可以给出基于数据的运行时错误?如果我错了,请纠正我…@Nitin Midha:不,这不会导致运行时错误。numUsersPerDate将为每个状态计数复制-结果将是笛卡尔乘积。然后我希望,它应该在from子句中,带有交叉连接。。。。SQL Server和MySQL之间有什么已知的区别吗?据我记忆所及,在SQL Server中它会给出一个错误…@Nitin Midha:CROSS JOIN只是用于生成笛卡尔乘积的ANSI-92语法。不,提供的查询也不会在SQL Server上产生错误-子选择非常常见,因为ANSI-89不支持外部连接。如果有链接表的条件,此示例将使用左连接重新编写。