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

时间:2019-02-24 20:47:53

标签: mysql sql

我想为一个主题分配1至3个人。然后,我想检索特定主题的作业。

我有一个表主题,其中有12个主题(列:id(PK),名称)。 我有一个表USERS,其中有十二个用户(列:id(PK),firstName,lastName等)

然后我创建了一个表AS_SUBJECTS,其中包含以下列(所有列都是整数):

id(PK), subjectName, user1, user2, user3  

关系:

  • subjectName是subject.id的FK
  • user1代表users.id
  • user2代表users.id
  • user3代表users.id

我希望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的列的文章。我需要的是如果值是NULL,则选择NO MATTER列。

2 个答案:

答案 0 :(得分:1)

只需将[INNER] JOIN上的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
...

有关各种连接类型的详细讨论,请参见this SO post

答案 1 :(得分:0)

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

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