MYSQL关联查询以逗号分隔id的数据
今天接触到一个mysql的业务场景
有两张表:course、teacher
course 表中有 teacher_ids 字段。里面存储的是 teacher 表的 id 以逗号分隔的字符串。
现在要查询 course 列表,并且关联查询出 teacher_ids 中关联教师的数据。
MySQL提供了一个名为FIND_IN_SET()
的内置字符串函数,允许您在逗号分隔的字符串列表中查找指定字符串的位置。
下面说明了FIND_IN_SET()
函数的语法。
FIND_IN_SET(needle,haystack);
FIND_IN_SET()
函数接受两个参数:
- 第一个参数
needle
是要查找的字符串。 - 第二个参数
haystack
是要搜索的逗号分隔的字符串列表。
参考:https://www.yiibai.com/mysql/find_in_set.html
原生语句用法:
select * from tp_course join tp_course_teacher on find_in_set(tp_course_teacher.id, tp_course.teacher_ids);
Typeorm:
async find({ where, order, take, skip }: findDto) {
const [list, total] = await this.courseRepository
.createQueryBuilder('course')
.leftJoinAndMapMany(
'course.teachers',
Teacher,
'teacher',
`FIND_IN_SET(teacher.id, course.teacher_ids)`,
)
.where(where)
.orderBy(order)
.take(take)
.skip(skip)
.getManyAndCount();
return { list, total };
}
knex 过滤:
const targetId = 123; // 要检查的目标 id
const result = await knex('your_table')
.whereRaw(`FIND_IN_SET(?, your_column) > 0`, [targetId])
.select('*');