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

MySQL没有结果,因为外键为空,mysql,sql,Mysql,Sql,我想给一个科目分配一到三个人。然后我想检索特定主题的作业 我有一个表主题,其中有十几个主题(列:id(PK),name)。 我有一个表USERS,其中有十几个用户(列:id(PK)、firstName、lastName等) 然后,我创建了一个表作为_主题,其中有以下列(所有列都是整数): 关系: subjectName是FK to subjects.id user1对users.id是FK user2对users.id是FK user3是对users.id的FK 我希望user2和user3

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

我有一个表主题,其中有十几个主题(列:id(PK),name)。 我有一个表USERS,其中有十几个用户(列:id(PK)、firstName、lastName等)

然后,我创建了一个表作为_主题,其中有以下列(所有列都是整数):

关系:

  • subjectName是FK to subjects.id
  • user1对users.id是FK
  • user2对users.id是FK
  • user3是对users.id的FK
我希望user2和user3是可选的,也就是说,可以有一个或两个或三个用户分配给一个主题。因此,我在这些列上允许NULL

现在让我们假设我在AS_主题中输入这些值:

id = 1
subjectName = 1
user1 = 7
user2 = NULL
user3 = NULL
如果我查询:
SELECT*FROM as_subjects,其中as_subjects.subjectName=1
我得到所有列的结果,包括那些具有空值的列

问题:我需要在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

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


只需将
用户
上的
[内部]连接
s更改为
左连接
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
...

有关各种连接类型的详细讨论,请参阅。

编辑了我的打字感谢必须将
用户上的
连接更改为
左连接
谢谢我刚刚尝试了它,效果很好。我将阅读连接类型,以便更好地理解如何使用这些类型。
...
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
...