Mysql 使用左联接从其他表中选择会导致筛选不起作用
我有一个疑问:Mysql 使用左联接从其他表中选择会导致筛选不起作用,mysql,left-join,filtering,where,Mysql,Left Join,Filtering,Where,我有一个疑问: SELECT r.*, COUNT(rt.id) total_task, IFNULL(SUM(IF(rt.status = 2, 1, 0)), 0) total_task_done FROM requests AS r LEFT JOIN request_participants AS rp ON rp.request_id = r.id LEFT JOIN request_tasks AS rt ON rt.request_id = r.id
SELECT
r.*,
COUNT(rt.id) total_task,
IFNULL(SUM(IF(rt.status = 2, 1, 0)), 0) total_task_done
FROM requests AS r
LEFT JOIN request_participants AS rp ON rp.request_id = r.id
LEFT JOIN request_tasks AS rt ON rt.request_id = r.id
WHERE r.id = 10 AND rp.user_id = 3 AND rp.role = 1
以下是包含数据的表格:
请求
+----+-----------------+--------+ | id | notes | status | +----+-----------------+--------+ | 10 | Some notes here | 1 | +----+-----------------+--------+
+----+---------+------------+------+ | id | user_id | request_id | role | +----+---------+------------+------+ | 18 | 3 | 10 | 0 | | 19 | 17 | 10 | 1 | +----+---------+------------+------+
请求参与者
+----+-----------------+--------+ | id | notes | status | +----+-----------------+--------+ | 10 | Some notes here | 1 | +----+-----------------+--------+
+----+---------+------------+------+ | id | user_id | request_id | role | +----+---------+------------+------+ | 18 | 3 | 10 | 0 | | 19 | 17 | 10 | 1 | +----+---------+------------+------+
id
、参与者的用户id
和角色
筛选出请求
数据
当我像上面的例子一样运行查询时,它返回一行(request.id=10
),但是如果我从查询中删除COUNT(rt.id)total_任务,IFNULL(SUM(if(rt.status=2,1,0)),0)total_task_done
行,它返回零行,这就是我想要的
你能帮我指出我的问题出在哪里吗?谢谢。您需要在
ON
子句中移动您的条件,以便在实际加入和添加GROUP BY
子句之前进行筛选
SELECT r.ID, r.notes, r.status,
COUNT(rt.id) total_task,
IFNULL(SUM(IF(rt.status = 2, 1, 0)), 0) total_task_done
FROM requests AS r
LEFT JOIN request_participants AS rp
ON rp.request_id = r.id
AND rp.user_id = 3
AND rp.role = 1
LEFT JOIN request_tasks AS rt
ON rt.request_id = r.id
WHERE r.id = 10
GROUP BY r.ID, r.notes, r.status
对各个表进行筛选,然后进行连接和聚合。试试这个:
SELECT A.id, A.notes, A.status,
SUM(IF(C.id IS NULL, 0, 1)) total_task,
IFNULL(SUM(IF(C.status = 2, 1, 0)), 0) total_task_done
FROM (SELECT * FROM requests
WHERE id = 10) A LEFT JOIN
(SELECT * FROM request_participants WHERE user_id = 3 AND role = 1) B
ON A.id=B.request_id LEFT JOIN
request_tasks C
ON A.id=C.request_id
GROUP BY A.id, A.notes, A.status;
是否确实要将条件移动到ON子句中?因为我试过你的,但还是一样。通过将条件保持在
上,它在哪里起作用。@RizkiPratama,因为您使用的是左连接
。如果在WHERE
子句中为表request\u参与者或request\u任务设置了条件,但条件不匹配,则它将不返回任何内容。这就像做内部连接
。你能根据你的上述记录展示样品吗?嗨。实际上,您并没有描述输出是如何作为输入的函数的。你希望我们能从你的例子中猜出来&一个错误的查询。说出在什么情况下,一行出现在您想要的结果中。如有必要或另外,将输出描述为某个查询结果的函数,返回足够的数据。“按[某些字段]筛选数据”不清楚。如果你知道如何正确地从它输出到当前期望的输出,考虑一下一个简单的期望输出。阅读groupby&aggregates的工作原理——没有groupby的聚合隐式地给出一个组。