【问题标题】:How to write an 'optional' WHERE clause for MySQL composite primary key tables如何为 MySQL 复合主键表编写“可选”WHERE 子句
【发布时间】:2014-07-29 00:29:48
【问题描述】:

我有两张桌子,staffstaff_datastaff 是一个普通表,staff_data 是一个类型/值复合主键表(主键是 Staff_ID 和类型的组合) - 所以数据示例如下所示:

+----------+--------------------+----------+
| Staff_ID | Type               | Value    |
+----------+--------------------+----------+
|        1 | Department         | IT       |
|        1 | Organisation       | BigCorp  |
|      821 | Department         | Finance  |
|        1 | NetworkUsername    | smith.j  |
+----------+--------------------+----------+

我的目标是查询将选择所有员工及其部门,如果他们没有在 staff_data 中列出的部门,它仍然会选择他们,但将部门列为空白。

以下查询仅包括在staff_data 中列出部门的员工

SELECT staff.name, staff_data.Value as Department 
FROM staff JOIN staff_data USING(Staff_ID)
WHERE staff_data.Type = ‘Department’
GROUP BY staff.Name

但如果我不包含 WHERE 子句,显然我得不到我想要的数据。我如何编写一个查询来列出所有员工,包括他们的部门(如果存在)?

【问题讨论】:

    标签: mysql join composite-primary-key


    【解决方案1】:

    使用外连接:

    SELECT staff.name, staff_data.Value as Department
    FROM staff
    LEFT OUTER JOIN staff_data
        ON staff.Staff_ID = staff_data.Staff_ID
           AND staff_data.Type = "Department"
    

    在左外连接中,如果右表没有与约束匹配的值,则输出仍将包含左表中的行。 (来自右表的列将为空。)

    【讨论】:

    • 你用OUTER JOIN:-( 打败了我。你不需要OR staff_data.staff_id is NULL 来抓住没有部门设置的员工吗?
    • @nurdglaw 否。这是ON 子句的一部分,它确定哪些行被连接在一起。大概他在staff_data 中没有行,staff_id 为空,所以这没有意义。 (另外,它无论如何都会通过staff.Staff_ID = staff_data.Staff_ID 测试。)
    • 谢谢它的工作。不知道您可以在 join 子句中执行“确保类型为部门”逻辑。
    • @cdhowie 感谢您的澄清 - 我误读了 join 语句,而且我认为我的意思是 staff_type IS NULL。
    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 2016-10-08
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多