Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.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
Php 棘手的MySQL查询不涉及_Php_Mysql_Join - Fatal编程技术网

Php 棘手的MySQL查询不涉及

Php 棘手的MySQL查询不涉及,php,mysql,join,Php,Mysql,Join,为了得到结果,我将两个表连接在一起。 一个表包含具有唯一ID评估的评估列表,而另一个表staff_to_assessments包含分配给工作人员的评估列表。此表的示例记录将包含工作人员唯一ID和工作分配唯一ID。这表明用户已链接到工作分配 我编写了一个函数,它只从评估表中获取评估,而这些评估没有分配给staff_to_评估表中的某个工作人员。这是为了在前端填充一个下拉框,如果需要,这些剩余的评估可以分配给工作人员,因此我不需要;我不想显示任何已分配的 MySQL查询如下: SELECT

为了得到结果,我将两个表连接在一起。 一个表包含具有唯一ID评估的评估列表,而另一个表staff_to_assessments包含分配给工作人员的评估列表。此表的示例记录将包含工作人员唯一ID和工作分配唯一ID。这表明用户已链接到工作分配

我编写了一个函数,它只从评估表中获取评估,而这些评估没有分配给staff_to_评估表中的某个工作人员。这是为了在前端填充一个下拉框,如果需要,这些剩余的评估可以分配给工作人员,因此我不需要;我不想显示任何已分配的

MySQL查询如下:

    SELECT * FROM assessments a 
    LEFT JOIN staff_to_assessment s2a ON a.assessment_id = s2a.assessment_id                            
    WHERE a.assessment_id NOT IN
         (SELECT assessment_id FROM staff_to_assessment WHERE staff_id = '" . (int)$options['staffId'] . "')";
这似乎没有产生我需要的反应。有人能看出我哪里出了错吗?
谢谢

我认为你的查询太难了。您只需查找与左侧外部联接不匹配的行:


您不需要同时使用left join和not in子句。

我认为您的查询太难了。您只需查找与左侧外部联接不匹配的行:

您不需要同时使用left join和not in子句。

像not in[subquery]这样的查询可以而且应该始终重写为left join

选择a* 从评估a 左图:使用评估id将staff_连接到评估s2a-相当于a.assessment_id=s2a.assessment_id,因为两列的名称相同 其中staff_id为空 这相当于:

选择a* 从评估a 如果a.assessment\u id不在“从员工到”assessment中选择assessment\u id 这两种方法通常都会针对相同的执行计划进行优化,但前者更可取,因为前者往往会产生更快的查询。

像[subquery]中的NOT这样的查询可以并且应该始终被重写为左连接

选择a* 从评估a 左图:使用评估id将staff_连接到评估s2a-相当于a.assessment_id=s2a.assessment_id,因为两列的名称相同 其中staff_id为空 这相当于:

选择a* 从评估a 如果a.assessment\u id不在“从员工到”assessment中选择assessment\u id
这两种方法通常都针对相同的执行计划进行优化,但前者更可取,因为它往往会产生更快的查询。

我认为在不存在的地方,子查询可以完成不存在也可以不存在如果staff_id列是一个数值,则不需要它周围的“。。。其中staff_id=。int$期权['staffId'];另外,$options数组来自哪里?是否来自用户,例如HTTP参数?它可能会构成安全威胁。。。考虑使用参数化SQL查询。我认为在不存在的情况下,子查询将执行StudioIn,也不需要工作,因为StudioID列是一个数值,不需要它周围的S……其中staff_id=。int$期权['staffId'];另外,$options数组来自哪里?是否来自用户,例如HTTP参数?它可能会构成安全威胁。。。考虑使用参数化SQL查询。谢谢。奇怪的是,我得到了正确的记录回来,虽然没有数据!如下所示:[0]=>数组[assessment\u id]=>[name]=>测试评估[description]=>测试评估3[active]=>0[staff\u to\u assessment\u id]=>[staff\u id]=>@funkyjimbob。我认为问题在于使用*时出现命名冲突,并且在不同的表中具有相同的列名。无论如何,您只需要来自的值,因此我在中添加了别名。谢谢。奇怪的是,我得到了正确的记录回来,虽然没有数据!如下所示:[0]=>数组[assessment\u id]=>[name]=>测试评估[description]=>测试评估3[active]=>0[staff\u to\u assessment\u id]=>[staff\u id]=>@funkyjimbob。我认为问题在于使用*时出现命名冲突,并且在不同的表中具有相同的列名。无论如何,您只需要来自的值,因此我在中添加了别名。
SELECT a.*
FROM assessments a LEFT JOIN
     staff_to_assessment s2a
     ON a.assessment_id = s2a.assessment_id                            
WHERE s2a.assessment_id is null;