我有一张如下表:
id user_id task task_closed
1 1 1 0
2 1 2 1
3 1 3 0
4 2 3 0
5 2 4 1
6 3 4 0
我需要的是一个查询,对于给定的任务,将返回具有此任务的所有用途,并为每个任务返回他们拥有的总体未完成任务的数量。
这样,如果我们谈论任务3 我想得到
user_id pending
1 2
2 1
,如
SELECT tasks.user_id,
( SELECT COUNT(*)
FROM tasks t2
WHERE t2.user_id=tasks.user_id AND t2.task_closed=0
)
FROM tasks
WHERE tasks.id=?
我也会把它重写为
SELECT user_id,COUNT(*)
FROM tasks
WHERE task=? AND task_closed=0
GROUP_BY user_id
WHERE user_id IN (SELECT t2.user_id from tasks t2 WHERE task=?);
但是我有一种强烈的感觉,应该有一种更有效的方法来通过某种方式加入桌子来做到这一点。
关于我应该怎么做的任何想法?
答案 0 :(得分:1)
尝试此查询
SELECT
b.userid,
count(*) as cnt
FROM
(SELECT DISTINCT userId FROM tasks WHERE task=?) a
INNER JOIN
tasks b
ON
a.userId=b.userid
WHERE
b.task_closed = 0
GROUP BY
b.userid
这将复制你的所作所为。但我对你的查询感到困惑。你正在为所有任务计算任务关闭,但你想要的结果只是由用户给出的任务。
答案 1 :(得分:0)
试试这个:
SELECT
t1.user_id,
COUNT(*)
FROM
tasks t1
INNER JOIN tasks t2
ON t2.user_id=t1.user_id
AND t2.task_closed=0
WHERE
t1.id=?
但是假设任务的id是task
列而不是id
列(因为id是唯一的,这意味着对于1个任务,你不再有一个用户)
SELECT
t1.user_id,
COUNT(*)
FROM
tasks t1
INNER JOIN tasks t2
ON t2.user_id=t1.user_id
AND t2.task_closed=0
WHERE
t1.task=?
GROUP BY
t1.user_id
更新:如果您想加入上面的查询结果以获取其他信息,请参阅:一些用户详细信息(field
表中的user_details
列)您可以使用方法:
SELECT
tmp.user_id,
tmp.nb,
user_details.field
FROM (
SELECT
t1.user_id,
COUNT(*) as nb
FROM
tasks t1
INNER JOIN tasks t2
ON t2.user_id=t1.user_id
AND t2.task_closed=0
WHERE
t1.task=?
GROUP BY
t1.user_id
) as tmp
LEFT JOIN user_details
ON user_details.user_id = tmp.user_id
答案 2 :(得分:0)
我认为这会奏效:
从tasks.task =?的任务中选择tasks.user_id,count(*)和task_closed = 0 group by user_id