我对sql查询有疑问。我会在上解释
**Table People**
| S.No| name|task|
| ----| ----|----|
| 1 | n1 |t1 |
| 2 | n2 |t2 |
| 3 | n3 |t1 |
| 4 | n4 |t1
| 5 | n5 |t2 |
**Table Tasks**
| S.No| taskid|taskname|
| ----| ----|----|
| 1 | t1 |task1|
| 2 | t2 |task2|
| 3 | t3 |task3|
| 4 | t4 |task4|
| 5 | t5 |task5|
我需要统计一项任务被分配给多少人,比如这个
**Expected result**
|task |count|
|-----|-----|
|task1| 3 |
|task2| 2 |
|task3| 0 |
我尝试了下面这样的查询,但它不起作用
SELECT COUNT(TASK) FROM PEOPLE WHERE TASK IN (SELECT TASKID IN TASKS)
上面的查询返回所有任务的总数。我需要在查询中修改什么以获得预期结果
它更像是:
SELECT t.taskname as task, COUNT(p.task) as `count`
FROM
task t
LEFT JOIN people p ON p.task = t.taskid
GROUP BY
t.taskname
从tasks(获取所有任务记录)到people(可能没有获取任何people记录,因此对于task3,p.task为null)的左联接肯定包含所有任务,但不是所有people。。对于那些有多个人的任务,任务名称将重复多次。当它被分组时,它就变成了一个单独的,我们可以对进行相应的计数
计算p.task
而不是COUNT(*)
是很重要的,因为COUNT(*)
将看到一行,如:
name, p.task
task3, null
如果我们count(*)
’d,它将计数为1,因为它是一行。。但是我们想要计算p.task
,因为NULL从未被计算过,所以我们得到该任务的计数为0
我会把people.task
称为people.taskid
,就我个人而言是
我真的不知道你说的";将结果打印为表"-这确实是前端的工作,但如果您的意思是要格式化输出,那么您需要查看类似CONCAT(...)
或CONCAT_WS(...)
的内容,这将允许您生成格式化文本作为输出
如果你的任务名称不是唯一的,那么你可以像@stickybit在评论中所说的那样,将t.taskid
也放在组中(或者相反;如果它是表的主键)
我不知道为什么你想要任务1到3,而不是4或5。一种方法是关联子查询:
SELECT T.*,
(SELECT COUNT(*) FROM PEOPLE P WHERE P.TASK = T.TASKID) as cnt
FROM TASK T;
如果你只想要一个子集的任务,你可以添加一个WHERE
子句:
SELECT T.*,
(SELECT COUNT(*) FROM PEOPLE P WHERE P.TASK = T.TASKID) as cnt
FROM TASK T;
WHERE TASK IN ('task1', 'task2', 'task3');
如果您只想要实际分配给人员的任务,则可以使用PEOPLE
表上的聚合:
SELECT P.TASK, COUNT(*)
FROM PEOPLE P
GROUP BY P.TASK;
但这不会返回未分配的任务。