SQL查询:按不同表中的多个列进行分组

时间:2014-11-04 14:07:32

标签: mysql sql postgresql activerecord mysqli

我有两个表用户和任务。我需要获取按Users.Name和Tasks.Status分组的任务计数。我需要一些帮助编写查询以使我的结果看起来与第三个表类似。

用户

|- Id -|- Name   -|
|- 1  -|- Robert -|
|- 2  -|- Bob    -|
|- 3  -|- Vicky  -|
|- 4  -|- Don    -|
|- 5  -|- Ron    -|
|- 6  -|- Harry  -|

任务

|- Id -|- Status     -|- user_id -|
|- 1  -|- Started    -|- 1       -|
|- 2  -|- Started    -|- 1       -|
|- 3  -|- Started    -|- 2       -|
|- 4  -|- Started    -|- 2       -|
|- 3  -|- Complete   -|- 1       -|
|- 4  -|- Complete   -|- 1       -|
|- 5  -|- Complete   -|- 2       -| 
|- 6  -|- Complete   -|- 2       -|

结果

|- Name   -|- Status   -|- Count -|
|- Robert -|- Complete -|- 2     -|
|- Robert -|- Started  -|- 2     -|
|- Bob    -|- Complete -|- 2     -|
|- Bob    -|- Started  -|- 2     -|
|- Vicky  -|- Complete -|- 0     -|
|- Vicky  -|- Started  -|- 0     -|
|- Don    -|- Complete -|- 0     -|
|- Don    -|- Started  -|- 0     -|
|- Ron    -|- Complete -|- 0     -|
|- Ron    -|- Started  -|- 0     -|
|- Harry  -|- Complete -|- 0     -|
|- Harry  -|- Started  -|- 0     -|

3 个答案:

答案 0 :(得分:4)

如果你想在答案中得到零,你需要先生成行。以下是获取结果的方法:

select u.name, s.status, count(t.userid) as cnt
from users u cross join
     (select distinct status from tasks) s left join
     tasks t
     on t.userid = u.id and t.status = s.status
group by u.name, s.status
order by u.name, s.status;

请注意,这是标准SQL,因此它适用于代码中的所有数据库。

答案 1 :(得分:0)

选择姓名,状态,计数(姓名,状态) 来自users.id = tasks.userid上的用户内部联接任务 按名称分组,状态

沿着这些方向,我生锈了

答案 2 :(得分:0)

你可以拥有一张状态表'因为并非所有用户都拥有处于所有状态的任务。如果没有这个,或者选择常量,你需要使用子查询来获取各种状态的列表。这可能会很慢。

您可以生成一个列表并与用户交叉加入,然后将这两个加入任务。

这样的事情: -

SELECT users.name, statii.status, COUNT(tasks.id)
FROM users
CROSS JOIN
(
    SELECT 'Started' AS status UNION SELECT 'Complete'
) statii
LEFT OUTER JOIN tasks
ON users.Id = tasks.user_id
AND statii.status = tasks.status
GROUP BY users.name, statii.status