mysql - 如何为 MySQL 组合主键表编写 'optional' WHERE 子句

标签 mysql join composite-primary-key

我有两个表,staffstaff_datastaff 是一个普通表,staff_data 是一个 Type/Value 复合主键表(主键是 Staff_ID 和 Type 的组合)——所以数据样本看起来像这个:

+----------+--------------------+----------+
| 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 子句,显然我得不到我想要的数据。我如何编写一个查询来列出所有员工,包括他们的部门(如果存在)?

最佳答案

使用外连接:

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"

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

关于mysql - 如何为 MySQL 组合主键表编写 'optional' WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24999753/

相关文章:

Django 多表继承和左外连接

JPA/Hibernate 和复合键

sql - 使用多列主键的优缺点是什么?

MySQL 不使用复合主键的第一列

mysql - 设计卖家、类别和产品表的最佳方法是什么?

php - 评级正确记录 PHP SQL

mysql - 如何在 Laravel 中使用聚合更新?

mysql - 获取子查询中的最大输入日期

php - 如何排除三个不同表的查询结果?

mysql - 如何使用虚拟数据创建数据库设计