mysql - 如何正确连接三个表
问题描述
主表有 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
解决方案
你已经回答了你的问题。第二个活动没有有效的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
.
推荐阅读
- python - 如何在 Python(网络爬虫)中调用 Javascript 函数?
- azure - 尝试从 Azure 容器实例打开 FQDN 时如何解决“无法连接到服务器”错误?
- php - 使用 FormData 上传图片获取在 iOS 上不起作用,但在 Android/PC 上有效
- matlab - 为什么 A 的行大小在 fmincon 中很重要
- amazon-web-services - 在 GUI 中禁用了在 Cognito 中将电子邮件设置为用户名的别名
- ajax - Laravel - Ajax 和 preventdefault
- xml - 如何将返回值添加到 cth_surefire XML 报告中?
- react-admin - Sorting a list by a referenced field react-admin
- java - 如何解决已经存在的程序类型:com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable
- css - 内联 div 与 flex