mysql一对多查询 将(多)记录合成一个字段

暴走的五花肉
  • 65

假设 学生表和 选课表是 一对多关系(我知道是多对多),怎么将学生所有选修课程 查出来合成一个字符串 当做一个字段 跟 学生信息一起查出来

学生表:
id name

课程表
course_id student_id course_name

我想要的效果是查出类似

1,"小明","语文,数学,英语"

也就是小明选修的 课程表中的所有课程合成 合成一个字符串 作为一个字段 跟学生信息一起展示

请问怎么实现?

回复
阅读 3.7k
2 个回答
一枚小白
  • 244
✓ 已被采纳

不使用sql解决

第一步:查询出学生信息

select id, name from student where id = 1;

第二步:根据student_id查询出课程信息

select course_id, student_id, course_name from course where student_id = #{studentId};

第三步:在内存中将课程名称拼接,并赋值到学生实体

// 第一步:查询学生信息
Student student = studentService.queryStudentById(1);

// 第二步:查询课程信息
List<Course> courseList = courseService.queryCourseByStudentId(student.getId());

// 第三步:将课程名称拼接成字符串
List<String> courseNameList = courseList.stream().map(Course::getCourseName).collect(Collectors.toList);
String courseName = String.join(",", courseNameList);

// 第四步:为学生实体赋值
student.setCourseName(courseName);

使用sql解决

select s.id, s.name, GROUP_CONCAT(c.course_name) from student s left join course c on c.student_id = s.id group by c.student_id;

select a.id,a.name,group_concat(b.course_name) from student a left join course b on a.id=b.student_id group by a.id,a.name;

宣传栏