sql - 如何在同一列中加入不同的 FK 值?

标签 sql postgresql knex.js

尽我所能:

我有什么...

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;

关于sql - 如何在同一列中加入不同的 FK 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55656278/

相关文章:

php - SQL - 查询选择文本与我的变量相似的行。(不是 "like "或 "where")

django - 在没有服务中断/没有停机的情况下部署 Django 应用程序

python - 无法在 Python 中执行 Postgres 查询

ruby-on-rails - 很抱歉,当用户尝试注册时,heroku 出现了问题

javascript - 如何将 2 个 postgres 数据库连接到我的应用程序?

sql - GROUP BY 的 COUNT(*) 个

带有 DATEDIFF 的 MySQL 查询

mysql - 检查日期范围是否在月份(日历)

javascript - 如何实时查看在 Postgres 上执行的查询?

javascript - Bookshelf.js/Knex.js 嵌套在单个查询中的位置