首页 > 解决方案 > 如何正确连接三个表

问题描述

主表有 4 列:

用户活动表

userActivityId  userId  therapistId activityId
1                1           1        1

这些列中的每一列都是一个表,这些值都是外键。

基本上我试图运行一个查询,该查询将加入用户表并根据用户 ID 提取他们的名字和姓氏。与治疗师相同 - 加入治疗师表,拉名 + 姓氏。最后加入活动表并从活动 ID 中提取活动名称和路径

其他表如下所示:

User Table
userId  fName   lName


Therapist Table
therapistId therapistFirstName  therapistLastName


Activity Table
activityId  activityTitle   activityPath

到目前为止,我的查询看起来像

SELECT 
User_Activities.userId, 
User_Activities.therapistId, 
User_Activities.activityId, 
Activities.activityTitle, 
Activities.activityPath, 
Users.fName, 
users.lName, 
Therapists.therapistFirstName, 
Therapists.therapistLastName 
FROM 
User_Activities 
INNER JOIN Users 
ON User_Activities.userId = Users.userId
INNER JOIN Therapists ON 
User_Activities.therapistId = Therapists.therapistId
INNER JOIN Activities ON
Activities.activityId = User_Activities.userActivityId
WHERE 
User_Activities.userId = 1;

当我运行此查询时,它只返回 1 行作为结果。但是,在 User_Activites 表中有两个活动分配给了 userId 1。

如果我改变: INNER JOIN 活动 ON Activities.activityId = User_Activities.userActivityId

从 INNER JOIN 到 LEFT JOIN 它将显示第二行,但是 activityTitle 和 activityPath 将在第二行显示为 NULL。

userActivityId  userId  therapistId     activityId    activityId    activityTitle   activityPath    fName   lName   therapistFirstName  therapistLastName   
1                 1           1              1            1         Brain           GZZ0zpUQ         S        C            M                      D
11                1           1              1           NULL              NULL            NULL      S        C             M                        D

标签: mysqlsql

解决方案


你已经回答了你的问题。第二个活动没有有效的ActivityId.

如果您想要用户的所有活动,那么您应该将查询表述为:

SELECT . . .
FROM Users u LEFT JOIN
     User_Activities ua
     ON ua.userId = u.userId LEFT JOIN
     Therapists t
     ON ua.therapistId = t.therapistId LEFT JOIN
     Activities a
     ON a.activityId = ua.userActivityId
WHERE u.userId = 1;

您想从要保留所有行的表开始。然后用于LEFT JOIN引入其他表。

另外两个值得注意的变化:

  • 表别名用于简化查询的读取和写入。SELECT需要更改以使用别名。
  • WHERE子句指的是Users表而不是UserActivities.

推荐阅读