【问题标题】:How to Join three tables properly如何正确连接三个表
【发布时间】:2019-07-19 10:49:10
【问题描述】:

主表有 4 列:

用户活动表

userActivityId  userId  therapistId activityId
1                1           1        1

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

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

其他表如下所示:

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 活动开启 活动.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

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    你的问题已经回答得差不多了。第二个活动没有有效的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

    【讨论】:

    • 我将此代码添加到查询中:FROM Users LEFT JOIN User_Activities ON User_Activities.userId = Users.userId LEFT JOIN Therapists ON User_Activities.treatmentId = Therapists.treatmentId LEFT JOIN Activities ON Activities.activityId = User_Activities。 userActivityId WHERE Users.userId = 1 但是最终结果保持不变。我在尝试实现您的代码时是否出错?
    • 我尝试将其格式化为行以使其更易于阅读,但它似乎不允许在评论部分进行正确格式化。
    • @AndroidNewbee 。 . .代码看起来正确。根据您的描述,应该可以解决问题。您可以设置某种数据库小提琴吗?
    • 以前没用过,但尝试设置表。这是链接:db-fiddle.com/f/cgRCrSi7hzfZvJCQncqNb4/2
    • 让它工作了,只是将最后一行从 ON a.activityId = ua.userActivityId 更改为 ON a.activityId = ua.activityId
    猜你喜欢
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多