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_Left Join_Filtering_Where - Fatal编程技术网

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的聚合隐式地给出一个组。