关联Courses与Enroled_courses表,获取高选课量课程详情报错求助
问题:关联课程表与选课表获取带选课人数的课程列表
需求:关联courses和enrolled_courses表,获取按选课人数从高到低排序的课程列表,同时需要返回课程的title、desc等信息。
初始实现(仅获取课程ID和选课次数)
最初仅实现了获取courseId及对应选课次数的代码:
const enrolled = await Enroled_courses.findAll({ attributes: [ 'courseId', [Sequelize.fn('COUNT', Sequelize.col('courseId')), 'count'], ], group: ['Enroled_courses.courseId'], order: [[Sequelize.col("count"), "DESC"]], limit: req.query.limit || 10, })
返回结果示例:
0: {courseId: '9839b20b-d45c-4c93-ba52-81d53839feb2', count: '7'} 1: {courseId: '56418231-8bf1-40c0-9ad1-b67dae108151', count: '7'} 2: {courseId: 'bac70dd1-3cf9-4a6e-a95d-5e716df6a8bd', count: '6'} 3: {courseId: 'e6f73cbe-3a6c-44fd-9c35-e03a8e97cf49', count: '3'} 4: {courseId: '49dde467-e990-4ac6-9087-ada4e078163f', count: '2'} 5: {courseId: '6783ba4f-3c4b-43c8-b2d7-8940d5bb653a', count: '2'}
错误的关联尝试及报错
尝试关联Course表获取更多字段时,使用了以下代码:
const enrolled = await Course.findAll({ include: [{ model: Enroled_courses, as: 'enroled_courses', attributes: [ 'courseId', [Sequelize.fn('COUNT', Sequelize.col('courseId')), 'count'], ] }], group: ['Enroled_courses.courseId'], limit: req.query.limit || 10 })
报错信息:
original: error: missing FROM-clause entry for table "Enroled_courses"
解决方案
原因分析
报错根源:
- 关联表已设置别名
enroled_courses,但group子句仍用原表名Enroled_courses引用字段,导致SQL无法识别对应表 - 聚合统计逻辑位置错误,应放在主表的
attributes中,而非关联表的属性配置里
正确实现方式一:从Course表出发关联查询
const enrolled = await Course.findAll({ attributes: [ 'id', // 替换为Course表的实际主键字段 'title', 'desc', // 通过关联表别名统计选课人数 [Sequelize.fn('COUNT', Sequelize.col('enroled_courses.courseId')), 'count'] ], include: [{ model: Enroled_courses, as: 'enroled_courses', attributes: [], // 不需要返回选课表字段,仅用于关联统计 required: false, // 设为true则只返回有选课记录的课程;false则包含无选课的课程(count为0) }], // group子句必须包含所有非聚合的Course字段 group: ['Course.id', 'Course.title', 'Course.desc'], order: [[Sequelize.col('count'), 'DESC']], limit: req.query.limit || 10 })
正确实现方式二:从Enroled_courses表出发关联Course表
const enrolled = await Enroled_courses.findAll({ attributes: [ [Sequelize.fn('COUNT', Sequelize.col('courseId')), 'count'] ], include: [{ model: Course, as: 'course', // 替换为模型定义中实际的关联别名 attributes: ['id', 'title', 'desc'] // 需要返回的课程字段 }], // group子句包含所有非聚合的Course字段 group: ['course.id', 'course.title', 'course.desc'], order: [[Sequelize.col('count'), 'DESC']], limit: req.query.limit || 10 })
内容的提问来源于stack exchange,提问作者kittu
相关产品推荐
相关产品推荐

