【问题标题】:Fetch active task of a person with joins获取具有联接的人员的活动任务
【发布时间】:2013-03-31 11:16:35
【问题描述】:

我有一个人员表和一个任务表。虽然一项任务可以由多人完成,但中间有一个“名册”表:

person
task_roster
task

我正在寻找一个返回每个人及其当前活动任务的查询。如果他们没有活动任务,它应该简单地返回 NULL。我一直在搞砸以下内容:

SELECT *
FROM person
LEFT OUTER JOIN task_roster ON (task_roster.person = person.id)
LEFT OUTER JOIN task on (task.id = task_roster.task AND task.status = 1)
ORDER BY person.name

我也遇到的问题是此查询返回旧的名册条目,因此对于他们之前执行的每个任务,我都会多次返回同一个人。我也尝试在 person.name 上添加 Group By,但我没有得到任何现役职责,只有 NULL 值。

我正在寻找的结果是这样的:

 +----------------+-----------+----------------+
 | person.name    | task.id   | task.name      |
 +----------------+-----------+----------------+
 | David Harris   | 5         | Maintenance    |
 | Karen Simmons  | 2         | Transport      |
 | Linda Foster   | 5         | Maintenance    |
 | Michael King   | NULL      | NULL           |
 +----------------+-----------+----------------+

大卫和琳达都在做同一个任务。名册表只不过是 person.id 和 task.id 之间的链接

【问题讨论】:

  • 你能给出你想要的结果的样本记录吗?
  • 我们需要更多信息:示例数据、表定义和当前(错误)输出......足以开始一个小提琴。
  • 还有——你如何定义“活动任务”?

标签: mysql sql select


【解决方案1】:

我想知道这是否可行:

SELECT person.*,task.status
FROM person
LEFT OUTER JOIN task_roster ON (task_roster.person = person.id)
LEFT OUTER JOIN task on task.id = task_roster.task
WHERE task.status=1
ORDER BY person.name

【讨论】:

    【解决方案2】:

    你也得到旧任务的原因是因为这个join语句:

    ...
    task_roster ON (task_roster.person = person.id)
    LEFT OUTER JOIN task
    ...
    

    基本上它显示表task_roster 中的所有记录。可能还有其他解决方案,但我下面的解决方案使用了一个子查询,它只获得具有特定活动任务的person。然后使用LEFT JOIN 将子查询的结果连接回表person,因此表person 上的每条记录都将显示在列表中,无论它在子查询中是否有匹配记录。

    SELECT  a.name AS PersonName,
            b.task AS TaskID,
            b.name AS TaskName
    FROM    person a
            LEFT JOIN
            (
                SELECT  a.person, a.task, b.name
                FROM    task_roster a
                        INNER JOIN task b
                            ON a.task = b.id
                WHERE   b.status = 1
            ) b ON  a.id = b.person
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      相关资源
      最近更新 更多