【问题标题】:MySQL Select all data, where person currently does not have a projectMySQL 选择所有数据,其中人员目前没有项目
【发布时间】:2023-02-01 17:29:36
【问题描述】:

我有一个问题,谷歌和 15 年的 IT 经验不再帮助我,我跑到角落里寻找解决方案,我希望有人能帮助我摆脱困境。

我有一个包含person数据的表,一个包含person_assignments的表和一个包含projects的表。每个人都可以参与多个项目(通过 person_assignments 连接)。

现在我想得到每个没有当前项目的人。 我知道如何只获得目前有项目的人。而且我知道如何只获得目前没有项目的 person_assignments。

但是以下声明仅向过去没有项目的人提供了不知道他们可能有当前项目的人:

SELECT DISTINCT e.id, e.pronoun, e.first_name, e.last_name, e.cost_center_id, e.roles_id, e.e_mail, e.phone, e.office_id, e.work_percentage
FROM Employees e 
LEFT OUTER JOIN Employee_Assignments ea ON ea.employee_id = e.id
WHERE ((NOT((ea.since_date <= DATE_ADD(NOW(), INTERVAL +2 WEEK) OR ea.since_date IS NULL)AND(NOT(ea.until_date <= DATE_ADD(NOW(), INTERVAL +2 WEEK)) OR ea.until_date IS NULL))OR NOT ea.booking_type = "hard") OR NOT {{ switch.value }})

我正在考虑让所有没有项目的人,然后从目前有项目的人中减去他们,但是我找不到语句从 sql 中的另一个减去集合,因为 MINUS 不起作用并且我有很多 WHERE 子句需要处理,为简单起见,我在这里将其删除。

附上小提琴:http://sqlfiddle.com/#!9/402fc9/1

【问题讨论】:

  • 没有深入探讨你的问题,但有几种方法可以在 MySQL 中模拟 MINUS。最著名的是反连接模式 (stackoverflow.com/a/31398185/625594) 和使用 NOT IN (...) 子查询。

标签: mysql


【解决方案1】:
    SELECT DISTINCT e.id, e.pronoun, e.first_name, e.last_name, e.cost_center_id, e.roles_id, e.e_mail, e.phone, e.office_id, e.work_percentage
FROM Employees e 
LEFT JOIN Employee_Assignments ea ON ea.employee_id = e.id
WHERE ea.id IS NULL OR (ea.until_date <= DATE_ADD(NOW(), INTERVAL +2 WEEK) AND ea.booking_type = "hard" AND {{ switch.value }})

该查询在 Employees 和 Employee_Assignments 表之间执行 LEFT JOIN,以便所有员工都将包含在结果集中,无论他们是否有相应的分配。 WHERE 子句然后过滤掉所有具有活动分配的员工(即 since_date 大于当前日期 + 2 周且 until_date 小于当前日期 + 2 周的分配)或 booking_type 为“hard”的分配" 并将开关值设置为 true。其余员工将是那些没有当前项目的员工。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多