Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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 - Fatal编程技术网

Mysql 如何使用聚合函数连接来自相关查询的数据?

Mysql 如何使用聚合函数连接来自相关查询的数据?,mysql,sql,Mysql,Sql,我有下表: userActions: id | uId | goodAction | actionOverridden | dateAdded 我编写了一个查询以获取: 良好操作的数量(行中goodAction=1) 错误操作数(行中goodAction=0) 被覆盖的操作数(行中actionoverrided=1) 上面的查询获取ID为520的用户的数据,但我想获取所有用户的此信息。使用上面的查询,我需要在PHP中获得一个用户列表,然后循环该列表并执行上面的查询,注入用户ID 如何修改

我有下表:

userActions:
id | uId | goodAction | actionOverridden | dateAdded
我编写了一个查询以获取:

  • 良好操作的数量(行中
    goodAction=1
  • 错误操作数(行中
    goodAction=0
  • 被覆盖的操作数(行中
    actionoverrided=1

上面的查询获取ID为
520
的用户的数据,但我想获取所有用户的此信息。使用上面的查询,我需要在PHP中获得一个用户列表,然后循环该列表并执行上面的查询,注入用户ID

如何修改上述查询以使其检索所有用户的数据


我知道需要从子查询中删除
和ua.uId=520
条件,并且我认为ua.uId的
分组将在子查询之外使用,但我不确定具体要做什么。

您可以使用CASE表达式代替所有这些相关查询,并使用group by获得所有用户的结果,如下所示:

SELECT t.uID,
       sum(case when t.goodAction = 0 then 1 else 0 end) as badActions,
       sum(case when t.goodAction = 1 then 1 else 0 end) as goodActions,
       sum(case when t.actionOverridden = 1 then 1 else 0 end) as actionOverrides
FROM userActions t
WHERE t.dateAdded > NOW() - INTERVAL 1 year
GROUP BY t.uID

您可以将COUNT和NULLIF与group by uID结合使用:

SELECT t.uID,
       COUNT(NULLIF(1, t.goodAction)) AS badActions,
       COUNT(NULLIF(0, t.goodAction)) AS goodActions,
       COUNT(NULLIF(0, t.actionOverridden)) AS actionOverrides
FROM userActions t
WHERE t.dateAdded > NOW() - INTERVAL 1 year
GROUP BY t.uID;
SELECT t.uID,
       COUNT(NULLIF(1, t.goodAction)) AS badActions,
       COUNT(NULLIF(0, t.goodAction)) AS goodActions,
       COUNT(NULLIF(0, t.actionOverridden)) AS actionOverrides
FROM userActions t
WHERE t.dateAdded > NOW() - INTERVAL 1 year
GROUP BY t.uID;