sql - 如何在同一列中加入不同的 FK 值?
问题描述
尽可能简单:
我有的...
Table users:
user_id | user_name
1 | Jack
2 | Chuck
Table jobs:
job_id | job_name
1 | Farmer
2 | Ninja
3 | Teacher
我希望我能用一个 JOIN 来做...
user_id | user_name | user_role
1 | Jack | 1, 2
2 | Chuck | 2, 3
我真正想要的...
user_id | user_name | user_role
1 | Jack | Farmer, Ninja
2 | Chuck | Ninja, Teacher
那么,我该怎么做呢?顺便说一句,我使用的是 knexjs,但是通过 SQL 解释,我可以自己完成剩下的工作。
解决方案
首先,您缺少一个将用户与其工作相关联的联结表:
user_jobs
user_id | job_id
1 | 1
1 | 2
2 | 2
2 | 3
定义此表后,我们只需要一系列连接:
SELECT
u.user_id,
u.user_name,
STRING_AGG(j.job_name, ',' ORDER BY j.job_id) user_role
FROM users u
INNER JOIN user_jobs uj
ON u.user_id = uj.user_id
INNER JOIN jobs j
ON uj.job_id = j.job_id
GROUP BY
u.user_id,
u.user_name;
推荐阅读
- arrays - Postgresql 递归更新 jsonb 键
- javascript - 为不存在的数组元素获取默认值而不是 `undefined`
- java - 打包到 jar 桌面 Spring Boot 项目时出现数据源错误
- python - 从 QGIS 工具栏菜单中删除工具栏
- r - R-Dplyr 在不均匀间隔的数据上移动总和
- java - 在 java 中签署特定 XML 标记时出错
- php - 覆盖 PHP OOP 中的方法
- amazon-web-services - 如何在 MWAA 中设置电子邮件警报?
- amazon - 需要从附加的 EBS (150GB) 扩展 lvm (centos-home)
- ios - 使用 mbuild 签署 Xamarin iOS 服务扩展