讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 SQL 查询中将一对多关系的外键数据聚合为单行逗号分隔字符串

秋辰大大_4435

秋辰大大_4435

发布时间:2026-03-04 23:25:17

|

766人浏览过

|

来源于php中文网

原创

如何在 SQL 查询中将一对多关系的外键数据聚合为单行逗号分隔字符串

本文介绍使用 MySQL 的 GROUP_CONCAT() 函数,将关联表(如 Vehicle)中属于同一主表记录(如 Form)的多个值(如 Plane、Yacht、Supercar)合并为一行、以逗号分隔的字符串,从而解决“一对多数据重复显示”的常见展示问题。

本文介绍使用 mysql 的 `group_concat()` 函数,将关联表(如 vehicle)中属于同一主表记录(如 form)的多个值(如 plane、yacht、supercar)合并为一行、以逗号分隔的字符串,从而解决“一对多数据重复显示”的常见展示问题。

在数据库规范化后,原本存储于单字段的多值(如 "Plane,Yacht")被拆分为独立记录存入关联表(Vehicle),这虽符合范式要求,却给前端展示带来挑战:默认 JOIN 查询会导致主表记录因匹配多条子记录而重复输出——例如 Frank Lampard 在结果集中出现 3 次,分别对应 Yacht、Supercar 和 Plane。理想效果是每个用户仅占一行,其车辆选择以 Yacht, Supercar, Plane 形式紧凑呈现。

核心解决方案:GROUP_CONCAT() 聚合函数

MySQL 提供的 GROUP_CONCAT() 可在 GROUP BY 基础上,将每组内的指定列值拼接为字符串。配合 INNER JOIN 与合理分组,即可实现“一对多→一对一展示”的转换:

SELECT 
  Form.FormId,
  Form.FirstName,
  Form.LastName,
  Form.Email,
  Form.Age,
  Form.Birthdate,
  Form.FavLanguage,
  GROUP_CONCAT(Vehicle.VehSelection SEPARATOR ', ') AS VehSelection
FROM Vehicle
INNER JOIN Form ON Form.FormId = Vehicle.FormId
GROUP BY Form.FormId;

✅ 关键要点说明:

  • GROUP BY Form.FormId 确保每个用户只生成一行结果;
  • GROUP_CONCAT(Vehicle.VehSelection SEPARATOR ', ') 将该用户所有 VehSelection 值用 ", " 连接(默认用逗号,SEPARATOR 可自定义);
  • 使用 INNER JOIN 仅返回至少拥有一项车辆选择的用户;若需包含无车辆记录的用户,请改用 LEFT JOIN 并配合 IFNULL(GROUP_CONCAT(...), 'None') 处理空值。

? PHP 展示层无需修改逻辑
原 view.php 中的循环结构完全适用,只需确保查询结果已通过 GROUP_CONCAT 预聚合:

<?php if ($table): ?>
  <?php foreach ($table as $d_row): ?>
    <tr>
      <td><?php echo htmlspecialchars($d_row["FirstName"]); ?></td>
      <td width="10"></td>
      <td><?php echo htmlspecialchars($d_row["LastName"]); ?></td>
      <td width="10"></td>
      <td><?php echo htmlspecialchars($d_row["Email"]); ?></td>
      <td width="10"></td>
      <td><?php echo (int)$d_row["Age"]; ?></td>
      <td width="10"></td>
      <td><?php echo date('d-m-Y', strtotime($d_row["Birthdate"])); ?></td>
      <td width="10"></td>
      <td><?php echo htmlspecialchars($d_row["FavLanguage"]); ?></td>
      <td width="10"></td>
      <td><?php echo htmlspecialchars($d_row["VehSelection"] ?: '—'); ?></td>
      <td width="10"></td>
      <td><a href="edit1.php?user_id=<?php echo (int)$d_row["FormId"]; ?>">Edit</a></td>
      <td width="10"></td>
      <td><a href="delete_feedback.php?user_id=<?php echo (int)$d_row["FormId"]; ?>">Delete</a></td>
    </tr>
  <?php endforeach; ?>
<?php endif; ?>

⚠️ 注意事项与最佳实践:

  • 安全性: 务必对输出内容使用 htmlspecialchars() 防止 XSS(如邮箱、姓名中的特殊字符);
  • 空值处理: 若某用户无车辆记录且使用 LEFT JOIN,VehSelection 将为 NULL,建议用 COALESCE(GROUP_CONCAT(...), 'None') 或 PHP 层判空;
  • 长度限制: GROUP_CONCAT 默认最大长度为 1024 字符,若车辆选项极多,需调整系统变量:SET SESSION group_concat_max_len = 10000;;
  • 排序控制: 可在 GROUP_CONCAT 内添加 ORDER BY 确保顺序稳定,例如:
    GROUP_CONCAT(Vehicle.VehSelection ORDER BY Vehicle.VehSelection SEPARATOR ', ')

通过此方案,你既保持了数据库的第三范式(3NF)设计,又实现了清晰、简洁的业务展示需求——每个用户一行,其多选车辆以可读格式聚合呈现,兼顾规范性与用户体验。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
常用的mysql管理工具
常用的mysql管理工具

常用的mysql管理工具有:1、MySQL Workbench、phpMyAdmin、MySQL Shell、Navicat、DBeaver和DataGrip。更多关于mysql管理工具的问题,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

6210

2023.11.03

phpmyadmin导入sql文件失败怎么办
phpmyadmin导入sql文件失败怎么办

在phpmyadmin导入sql文件失败时,可以尝试以下解决方案:1、检查文件权限和格式;2、确保文件字符集与数据库兼容;3、确认表结构兼容;4、检查外键约束和禁用外键检查;5、增加最大上传文件大小;6、分批导入或使用命令行导入;7、联系托管提供商寻求帮助。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3924

2024.04.02

phpmyadmin怎么改成中文
phpmyadmin怎么改成中文

通过安装中文语言包、将其上传到 phpmyadmin 目录、修改配置文件和重启 phpmyadmin,可以将 phpmyadmin 的界面改为中文。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

861

2024.04.07

phpmyadmin访问不了怎么回事
phpmyadmin访问不了怎么回事

phpmyadmin 无法访问可能是以下原因造成:1、服务器问题:mysql 服务未运行或防火墙阻止访问;2、配置问题:安装/配置错误、错误的配置文件设置或缺少必要的 php 扩展;3、浏览器问题:浏览器缓存、扩展干扰或浏览器不兼容;4、其他原因:dns 问题、恶意软件或网络连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

959

2024.04.07

phpMyAdmin安装教程大全
phpMyAdmin安装教程大全

本专题整合了phpMyAdmin程序安装相关教程,阅读专题下面的文章了解更多详细内容。

945

2025.10.31

PHPMyadmin配置
PHPMyadmin配置

本专题整合了phpmyadmin配置相关教程,阅读专题下面的文章了解更多详细步骤。

569

2025.12.04

XAMPP 与 phpMyAdmin 数据库管理实操
XAMPP 与 phpMyAdmin 数据库管理实操

专注于 XAMPP 内置的 phpMyAdmin 数据库管理工具,系统讲解数据库和数据表的创建与设计、SQL 语句执行、CSV/SQL 格式数据的导入导出、定时备份与一键还原、多数据库批量管理等日常操作,帮助开发者高效管理本地 MySQL 数据。

355

2026.04.08

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn