mysql - MySQL没有结果,因为外键是NULL
问题描述
我想为一个主题分配一到三个人。然后我想检索特定主题的作业。
我有一个表 SUBJECTS,其中有十几个主题(列:id(PK),名称)。我有一个表用户,其中有十几个用户(列:id(PK)、firstName、lastName 等)
然后我创建了一个表 AS_SUBJECTS,其中有以下列(所有这些都是整数):
id(PK), subjectName, user1, user2, user3
关系:
- subjectName 是 subject.id 的 FK
- user1 是 users.id 的 FK
- user2 是 users.id 的 FK
- user3 是 users.id 的 FK
我希望 user2 和 user3 是可选的,即可以有一个或两个或三个人分配给一个主题。因此,我允许在这些列上使用 NULL。
现在假设我在 AS_SUBJECTS 中输入这些值:
id = 1
subjectName = 1
user1 = 7
user2 = NULL
user3 = NULL
如果我查询:SELECT * FROM as_subjects WHERE as_subjects.subjectName = 1;
我得到所有列的结果,包括具有 NULL 值的列。
问题:我需要在 AS_SUBJECTS 中查询一个主题,并为分配给该主题的每个用户检索 users.firstName 和 users.lastName。所以我使用别名:
SELECT
as_subjects.subjectName
as_subjects.user1
u1.firstName as user1FirstName
u1.lastName as user1LastName
as_subjects.user2
u2.firstName as user2FirstName
u2.lastName as user2LastName
as_subjects.user3
u3.firstName as user3FirstName
u3.lastName as user3LastName
FROM as_subjects
JOIN subjects ON as_subjects.subjectName = subjects.id
JOIN users u1 ON as_subjects.user1 = users.id
JOIN users u2 ON as_subjects.user2 = users.id
JOIN users u3 ON as_subjects.user3 = users.id
WHERE as_subjects.subjectName = 1;
查询有效,但是当as_subjects.user2或3为NULL时,设置为空,根本没有数据。
关于如何实现这一目标的任何意见?我能找到的只是关于如何选择值为 NULL 的列的帖子。我需要的是选择列 NO MATTER 如果值为 NULL。
解决方案
只需将[INNER] JOIN
s on更改users
为LEFT JOIN
s
...
FROM as_subjects
JOIN subjects ON as_subjects.subjectName = subjects.id
LEFT JOIN users u1 ON as_subjects.user1 = users.id
LEFT JOIN users u2 ON as_subjects.user2 = users.id
LEFT JOIN users u3 ON as_subjects.user3 = users.id
...
有关各种联接类型的详细讨论,请参阅此 SO 帖子。
推荐阅读
- javascript - 如何在写入时拆分 WriteStream?
- python - DataFrame Plot:如何对 X 轴进行排序
- python - 如何在 Python 中具有浮点数列表的 2 个单元格之间寻找具有容差的相等性?
- twilio - 如何在 Studio 中存储 JSON 变量?
- laravel - 复选框在 Laravel Nova 自定义工具中不起作用
- google-apps-script - 有没有办法使用/结合 python 代码和添加谷歌套件?
- php - mySQL 结果为 JSON 数组 PHP
- sql - 找出比较同一行中其他列的最小列值
- ios - 如何在 SwiftUI 中检测 TextField 的实时变化?
- c# - 尝试添加新产品时,一个或多个实体的验证失败