You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中如何使用数据透视表关联多张表?(含多表示例)

多表关联查询:聚合用户技能为逗号分隔列表

嘿,我来帮你搞定这个查询需求!要把这四张表关联起来,输出包含用户名、邮箱和逗号分隔技能列表的结果,我们可以用表关联+字符串聚合函数来实现,下面分不同数据库给出具体写法:

MySQL 版本

这是最常用的写法,用GROUP_CONCAT来聚合技能:

SELECT 
    u.name,
    up.email,
    GROUP_CONCAT(s.skill_name SEPARATOR ', ') AS skills
FROM users u
JOIN user_profile up ON u.id = up.user_id
LEFT JOIN user_skills us ON u.id = us.user_id
LEFT JOIN skills s ON us.skill_id = s.id
GROUP BY u.id, u.name, up.email;

PostgreSQL/SQL Server 版本

这两个数据库用STRING_AGG函数:

SELECT 
    u.name,
    up.email,
    STRING_AGG(s.skill_name, ', ') AS skills
FROM users u
JOIN user_profile up ON u.id = up.user_id
LEFT JOIN user_skills us ON u.id = us.user_id
LEFT JOIN skills s ON us.skill_id = s.id
GROUP BY u.id, u.name, up.email;

Oracle 版本(11g及以上)

Oracle用LISTAGG函数,还可以指定技能排序:

SELECT 
    u.name,
    up.email,
    LISTAGG(s.skill_name, ', ') WITHIN GROUP (ORDER BY s.skill_name) AS skills
FROM users u
JOIN user_profile up ON u.id = up.user_id
LEFT JOIN user_skills us ON u.id = us.user_id
LEFT JOIN skills s ON us.skill_id = s.id
GROUP BY u.id, u.name, up.email;

结果说明

用你提供的测试数据运行以上查询,会得到你想要的结果:

nameemailskills
abcabc@gmail.comjava, php
cccccc@gmail.comjava

小提示

  • 用LEFT JOIN关联技能表是为了保证没有技能的用户也能出现在结果里,如果确定所有用户都有技能,换成INNER JOIN也可以。
  • SEPARATOR可以自定义分隔符,比如你想要分号分隔就改成'; '。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:14:49