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