【问题标题】:SQL query for all grouped records in joined table连接表中所有分组记录的 SQL 查询
【发布时间】:2022-01-13 09:01:36
【问题描述】:

让我们考虑一个玩具示例。有一个表雇员和表任务,其中每个任务分配给一个员工。一名员工可以有多项任务。

我想查询员工按任务中的某些列过滤他们。我将员工分组,每个员工只显示一次。查询将是这样的:

SELECT * 
FROM employees emp JOIN tasks tsk on emp.id = tsk.assigned_emp
WHERE tsk.deadline = today
GROUP BY employees

这很好,但现在假设我想选择没有任何任务的员工,这些任务的截止日期是今天到期。我的第一次尝试是:

tsk.deadline != today

but then is 查找至少有一项今天未到期的任务的员工。如何编写查询以包含给定员工的所有可能的任务?

【问题讨论】:

  • 这是一个常见问题解答。请在考虑发布之前阅读手册和谷歌任何错误消息和许多清晰、简洁和准确的问题/问题/目标的措辞,带有和不带有您的特定名称/字符串/数字、“site:stackoverflow.com”和标签;阅读许多答案。反映你的研究。请参阅How to AskHelp center 和投票箭头鼠标悬停文本。如果您发布问题,请使用一个措辞作为标题。

标签: mysql sql join


【解决方案1】:

这个反连接任务有几种不同的解决方案。其中之一是使用NOT EXISTS

SELECT *
FROM employee e
WHERE NOT EXISTS(
  SELECT 1
  FROM tasks t
  WHERE e.id = t.assigned_emp and t.deadline = today
)

【讨论】:

    【解决方案2】:

    您需要LEFT JOIN ... IS NULL 模式。

    SELECT * 
      FROM employees emp 
      LEFT JOIN tasks tsk   ON emp.id = tsk.assigned_emp
                           AND tsk.deadline = today
     WHERE tsk.deadline IS NULL
     GROUP BY employees
    

    JOIN 从其第一个表中删除与您的 ON 条件不匹配的行。相比之下,LEFT JOIN 将它们留在原处,将 NULL 值放入第二个表的结果列中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多