You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多表关联查询求助:含多关联关系的5张业务表关联实现及已解决

多表关联查询实现方案(针对你的5张表结构)

嘿,我来帮你把这几张表的关联逻辑讲明白!先理清楚每张表之间的关联关系,再给你具体的SQL示例,这样你就能直接套用啦。

先理清表间关联关系

你的这5张表里,junction_table是核心的中间关联表,它把用户、职位、部门、组织都串了起来:

  • userjunction_table:通过 user.id = junction_table.userid 关联
  • desi(职位表)和 junction_table:通过 desi.id = junction_table.desg_id 关联
  • dept(部门表)和 junction_table:通过 dept.id = junction_table.dept_id 关联
  • org(组织表)和 junction_table:通过 org.id = junction_table.org_id 关联

另外,desi本身也关联deptdesi.dept_id = dept.id),dept关联orgdept.org_id = org.id),这是层级关联的路径,后面会用到。

基础多表关联查询(INNER JOIN)

如果只需要查询那些已经在中间表有记录的关联数据(比如已经分配了职位部门的用户),用INNER JOIN就最合适,它会只返回所有表都匹配的记录。

比如查询某个用户的姓名、职位、所属部门和组织:

SELECT
    u.name AS username,
    d.desgname AS designation,
    de.deptname AS department,
    o.orgname AS organization
FROM
    junction_table jt
INNER JOIN
    user u ON jt.userid = u.id
INNER JOIN
    desi d ON jt.desg_id = d.id
INNER JOIN
    dept de ON jt.dept_id = de.id
INNER JOIN
    org o ON jt.org_id = o.id
-- 筛选特定用户,把1换成你要查的用户ID
WHERE
    u.id = 1;

包含未关联数据的查询(LEFT JOIN)

要是你想查询所有用户,包括那些还没分配职位、部门的用户,就用LEFT JOIN,它会保留左表(这里是user)的所有记录,没有匹配的关联数据会显示为NULL,你可以用COALESCENULL换成友好的提示文字:

SELECT
    u.name AS username,
    COALESCE(d.desgname, '未分配职位') AS designation,
    COALESCE(de.deptname, '未分配部门') AS department,
    COALESCE(o.orgname, '未分配组织') AS organization
FROM
    user u
LEFT JOIN
    junction_table jt ON u.id = jt.userid
LEFT JOIN
    desi d ON jt.desg_id = d.id
LEFT JOIN
    dept de ON jt.dept_id = de.id
LEFT JOIN
    org o ON jt.org_id = o.id;

层级关联的方式(确保数据一致性)

如果担心junction_table里的dept_id或者org_iddesidept里的对应ID不一致,你可以不用中间表的部门、组织ID,而是通过职位表→部门表→组织表的层级来关联,这样能保证职位对应的部门和组织是完全匹配的:

SELECT
    u.name AS username,
    d.desgname AS designation,
    de.deptname AS department,
    o.orgname AS organization
FROM
    junction_table jt
INNER JOIN
    user u ON jt.userid = u.id
INNER JOIN
    desi d ON jt.desg_id = d.id
INNER JOIN
    dept de ON d.dept_id = de.id
INNER JOIN
    org o ON de.org_id = o.id
WHERE
    u.id = 1;

单表关联的基础逻辑

其实单表关联就是多表关联的基础,比如你只想查用户和他的所有关联记录,只需要把userjunction_table关联就行:

SELECT
    u.name,
    jt.desg_id,
    jt.dept_id,
    jt.org_id
FROM
    user u
INNER JOIN
    junction_table jt ON u.id = jt.userid
WHERE
    u.id = 1;

要是你还有其他筛选需求,比如按部门查询所有用户,或者按组织统计人数,只需要在WHERE里加对应的条件,或者用GROUP BY分组就行啦!

内容的提问来源于stack exchange,提问作者aziz

火山引擎 最新活动