MYSQL关联查询以逗号分隔id的数据

2023-06-19 下午后端 48 次浏览暂无评论

今天接触到一个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('*');

目录

ICP备案号:鲁ICP备2020040322号