MySQL没有结果,因为外键为NULL

Posted

技术标签:

【中文标题】MySQL没有结果,因为外键为NULL【英文标题】:MySQL no results because foreign key is NULL 【发布时间】:2019-07-18 06:39:06 【问题描述】:

我想为一个主题分配一到三个人。然后我想检索特定主题的作业。

我有一个表 SUBJECTS,其中有十几个主题(列:id(PK),名称)。 我有一个表 USERS,其中有十几个用户(列: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。

【问题讨论】:

编辑我的错字谢谢 只需将users 上的JOINs 更改为LEFT JOINs 【参考方案1】:

只需将users 上的[INNER] JOINs 更改为LEFT JOINs

...
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
...

有关各种联接类型的详细讨论,请参阅 this SO post。

【讨论】:

谢谢你,我刚试过,它工作。我将阅读 JOIN 类型以更好地了解如何使用这些类型。【参考方案2】:

查看不同类型的连接 - 例如,您可能正在寻找左外连接。 (即,只要您想保留“右侧”表与“左侧”表不匹配的行,请在示例中将 JOIN 替换为 LEFT OUTER JOIN)

https://www.sunnyhoi.com/app/uploads/2017/07/inner-join-vs-cross-join-in-sql-server.jpg

【讨论】:

以上是关于MySQL没有结果,因为外键为NULL的主要内容,如果未能解决你的问题,请参考以下文章

EF 外键为 NULL

MySQL查看外键可以为NULL的位置

Eloquent 将可选条件添加到外键为 null 的 hasMany

Hibernate多对一更新外键为null

在 ASP.NET 中,外键为 NULL,在 1 对多的关系中。如何在控制器中添加它?

mysql表中,表的外键关联自身主键,为啥插入不了数据?