从连接中选择值并替换空单元格

时间:2015-02-21 19:33:43

标签: mysql sql

我必须使用以下关系创建一个选择查询:

  • 人员(member_id,first_name,last_name,email,boolean grad_p)
  • 团队(team_id,boolean grad_p,int max_size,team_name, team_captain)
  • 成员(member_id,team_id,captain_p,...)

我需要找到每个队长的名字,如果没有队长,我需要展示“没有队长”。现场队长p与member_id的数据相同。不幸的是,member_id是主键,所以我不相信我可以加入它们。如果有队长,则布尔grad_p为0,如果没有队长则为1。如果团队表中没有团队队长,则team_captain元组会有数据“null”'。

我一直在研究这个问题并且谷歌搜索没有帮助我找到解决方案。

1 个答案:

答案 0 :(得分:2)

您可以使用外部联接。外连接将返回一个表的所有行,无论它是否在另一个表中有任何相应的匹配。换句话说,如果我在team_captainmember_id列上加入“团队”和“人员”,即使成员为空,我也会得到所有团队。例如,假设人员看起来像这样:

| member_id | name |
+-----------+------+
|     1     | John |
|     2     | Jane |
|     3     | Jack |

团队看起来像这样:

| team_id | team_captain |
+---------+--------------+
|    1    |       1      |
|    2    |       null   |
|    3    |       3      |

我可以预先形成外部联接以获得团队队长的名字:

SELECT t.team_id, p.name
FROM teams t
LEFT JOIN personnel p ON p.member_id = t.team_captain;

我将得到名称,如果不存在则为空字段:

| team_id | name |
+---------+------+
|    1    | John |
|    2    | null |
|    3    | Jack |

以下是有关outer joins的更多信息。现在,MySQL提供的一个奇特的功能是COALESCE。这是一个返回第一个非null参数的函数。您可以使用它将这些空字段替换为“No Captain”:

SELECT t.team_id, COALESCE(p.name, 'No Captain') AS captain
FROM teams t
LEFT JOIN personnel p ON p.member_id = t.team_captain;

以下是我的表格的SQL Fiddle示例。