【问题标题】:Select values from a join and replace null cells从连接中选择值并替换空单元格
【发布时间】:2015-02-21 19:33:42
【问题描述】:

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

  • 人员(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 是一个主键,所以我不相信我可以加入它们。 Boolean grad_p 如果有队长,则为 0,如果没有,则为 1。如果 teams 表中没有队长,则 team_captain 元组的数据为“null”。

我已经为此工作了一段时间,谷歌搜索并没有帮助我找到解决方案。

【问题讨论】:

  • 你还在努力解决这个问题吗?
  • 不,抱歉回复晚了。
  • 很高兴知道。如果它解决了您的问题,请随时接受我的回答,或者使用您使用的解决方案回答您自己的问题。如果他们偶然发现您的问题,这将有助于未来的读者。

标签: mysql sql


【解决方案1】:

您可以为此使用外连接。外连接将返回一个表的所有行,无论它在另一个表中是否有任何对应的匹配项。换句话说,如果我在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。这是一个返回第一个非空参数的函数。您可以使用它来将那些空字段替换为“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 我的表格示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 2020-05-16
    • 2016-03-24
    • 1970-01-01
    相关资源
    最近更新 更多