如何正确连接三个表

时间:2019-07-19 10:49:10

标签: mysql sql

主表有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活动开启     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

1 个答案:

答案 0 :(得分:0)

您已经回答了几乎所有的问题。第二个活动没有有效的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