首页 > 解决方案 > 在 MySQL 中使用 JOIN 优化这些嵌套的 IN 语句

问题描述

我正在编写一个查询以从表中排除特定的员工组。假设我有表 1,transaction_details,其中包含我想要选择的信息。表 2,employee_task_associations,将每个员工映射到他们在特定日期分配的任务。它有一个employee_id 字段和一个map_id 字段,它是不同任务的id。该表是关联表,因此表 1 和表 3 可以具有多对多关系。表 3,employee_tasks,列出了员工可以拥有的所有任务。

我写了这个查询,它是功能性的,但没有优化:

SELECT someInfo FROM transaction_details TD
WHERE TD.employee_id NOT IN
  (SELECT employee_id from employee_task_associations ETA
    WHERE map_id IN
      (SELECT id FROM employee_tasks ET
       WHERE ET.taskName = "The task I want to exclude"))

虽然这有效,但它将运行多个查询。我想通过用 JOINS 替换嵌套的 NOT IN 和 IN 语句来加快速度。

我知道我可以用以下内容替换底部的四行:

SELECT employee_id FROM employee_task_assocations ETA
  LEFT OUTER JOIN employee_tasks ET
    ON ETA.map_id = ET.id
    WHERE ET.taskName = "The task I want to exclude"

这将返回完成此任务的员工的所有 ID 的列表。我想通过使用 JOIN 而不是子查询,从 transaction_details 中的 SELECT 语句中排除这些。我尝试使用 ETA.id IS NULL 的 LEFT OUTER JOIN,但这不起作用。在这种情况下,如何使用 JOIN 排除某些员工?

标签: mysqljoinwhere

解决方案


您似乎很接近您的初始查询,但为什么不加入 NOT IN 查询并获得不同的员工......像

SELECT 
      TD.someInfo 
   FROM 
      transaction_details TD
   WHERE 
      TD.employee_id NOT IN
         (SELECT DISTINCT
                employee_id 
             from 
                employee_task_associations ETA
                   JOIN employee_tasks ET
                      ON ETA.map_id = ET.ID
                      AND ET.taskName = "The task I want to exclude")

推荐阅读