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;
结果说明
用你提供的测试数据运行以上查询,会得到你想要的结果:
| name | skills | |
|---|---|---|
| abc | abc@gmail.com | java, php |
| ccc | ccc@gmail.com | java |
小提示
- 用
LEFT JOIN关联技能表是为了保证没有技能的用户也能出现在结果里,如果确定所有用户都有技能,换成INNER JOIN也可以。 SEPARATOR可以自定义分隔符,比如你想要分号分隔就改成'; '。
内容的提问来源于stack exchange,提问作者user8758118
相关产品推荐
相关产品推荐

