Mysql,使用FIND_IN_SET()函数处理多表关联问题.

news2024/9/21 4:29:33

这里有 user表、teacher表,其中 teacher.user_ids 字段中的值是 user.id 值以英文半角逗号拼接而来。

现在, 我们需要在查询 teacher 表数据时,将 user.name 的值也查询出来。

使用以下的SQL语句,即可实现需求。

SELECT
    GROUP_CONCAT(DISTINCT u.name) AS nameList,
    t.user_ids,
    t.*

FROM teacher t
LEFT JOIN `user` u ON FIND_IN_SET(u.id, t.user_ids) > 0 AND u.is_deleted = 'n'
GROUP BY t.teacher_id
LIMIT 100;

在以上的SQL中,需要注意的是:FIND_IN_SET(u.id, t.user_ids) > 0,GROUP BY t.teacher_id 这两组条件不可少。

在以上的SQL中, 我的数据库 sql_mode 中不含 'ONLY_FULL_GROUP_BY' 值 . 不了解 "sql_mode" 含义的小伙伴,可以参考我之前的一篇文章: MySQL的sql_mode模式

使用的数据库表、表数据如下所示。


CREATE TABLE user (
  id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID, 主键.',
  is_deleted varchar(4) DEFAULT NULL COMMENT '是否删除, n否,y是.',
  name varchar(100) DEFAULT NULL COMMENT '姓名',
  age int(3) DEFAULT NULL COMMENT '年龄',
  create_date datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1018 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';


CREATE TABLE teacher (
  teacher_id bigint(12) NOT NULL AUTO_INCREMENT COMMENT '主键',
  teacher_name varchar(255) DEFAULT '' COMMENT '姓名',
  teacher_image varchar(255) DEFAULT '' COMMENT '图片',
  teacher_age int(3) DEFAULT NULL COMMENT '年龄',
  teachert_address varchar(255) DEFAULT NULL COMMENT '地址',
  teacher_sex varchar(8) DEFAULT NULL COMMENT '性别',
  teacher_status int(2) DEFAULT NULL COMMENT '状态, 0-正常, 1-异常. ',
  create_date datetime DEFAULT NULL COMMENT '创建时间',
  update_date datetime DEFAULT NULL COMMENT '修改时间',
  user_ids varchar(255) DEFAULT NULL COMMENT 'user表中的ID,以 '','' 分割.',
  PRIMARY KEY (teacher_id)
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8 COMMENT='教师表';


-- 用户表 数据
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (1, 'n', '张三三', 28, '2020-04-02 09:54:23');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (2, 'n', '硫萄萄糖', 27, '2020-01-05 11:20:00');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (4, 'n', '李四', 25, '2019-10-22 16:27:03');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (5, 'n', '刘涛', 22, '2020-04-06 08:07:30');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (6, 'n', '张曼玉', 18, '2020-04-09 17:21:45');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (7, 'n', '刘德华', 33, '2020-03-18 17:22:07');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (8, 'n', '刘备', 23, '2020-03-17 17:22:34');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (1001, 'n', '王小二', 18, '2020-04-06 08:07:30');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (1005, 'y', '王小二', 18, '2021-06-06 15:14:10');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (1006, 'n', 'admin', 20, '2020-02-20 16:12:45');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (1017, 'y', 'A4', 20, '2022-11-15 10:52:51');


-- 教师表 数据
INSERT INTO teacher(teacher_id, teacher_name, teacher_image, teacher_age, teachert_address, teacher_sex, teacher_status, create_date, update_date, user_ids) VALUES (1, 'hhh', 'hhh.jpg', NULL, NULL, NULL, 1, '2022-09-20 16:17:25', '2022-09-21 18:17:35', '1,2,4');
INSERT INTO teacher(teacher_id, teacher_name, teacher_image, teacher_age, teachert_address, teacher_sex, teacher_status, create_date, update_date, user_ids) VALUES (2, 'ggg', 'ggg.jpg', NULL, NULL, NULL, 4, NULL, NULL, '1,2,5');
INSERT INTO teacher(teacher_id, teacher_name, teacher_image, teacher_age, teachert_address, teacher_sex, teacher_status, create_date, update_date, user_ids) VALUES (3, 'abc', 'abc.jpg', NULL, NULL, NULL, 3, NULL, NULL, '5,6');
INSERT INTO teacher(teacher_id, teacher_name, teacher_image, teacher_age, teachert_address, teacher_sex, teacher_status, create_date, update_date, user_ids) VALUES (4, 'def', 'def.jpg', NULL, NULL, NULL, 8, '2022-10-21 11:30:46', NULL, '1001,1002');
INSERT INTO teacher(teacher_id, teacher_name, teacher_image, teacher_age, teachert_address, teacher_sex, teacher_status, create_date, update_date, user_ids) VALUES (5, '张江', 'hhh.jpg', 25, '浙江省-杭州市-江干区', '男', 1, '2020-01-15 00:00:00', '2020-02-22 00:00:00', '1001,1005');
INSERT INTO teacher(teacher_id, teacher_name, teacher_image, teacher_age, teachert_address, teacher_sex, teacher_status, create_date, update_date, user_ids) VALUES (6, '柳乐儿', 'ggg.jpg', 24, NULL, '女', 4, NULL, '2021-03-04 00:00:00', '1001,1002');
INSERT INTO teacher(teacher_id, teacher_name, teacher_image, teacher_age, teachert_address, teacher_sex, teacher_status, create_date, update_date, user_ids) VALUES (7, '王大锤', 'abc.jpg', NULL, '浙江省-杭州市-余杭区', NULL, 3, '2020-05-06 00:00:00', NULL, NULL);
INSERT INTO teacher(teacher_id, teacher_name, teacher_image, teacher_age, teachert_address, teacher_sex, teacher_status, create_date, update_date, user_ids) VALUES (11, '张三奶奶', 'hhh.jpg', 90, '辽宁省-营口区-长白山', '女', 1, '1932-08-25 16:34:41', '2022-10-12 18:42:33', NULL);
INSERT INTO teacher(teacher_id, teacher_name, teacher_image, teacher_age, teachert_address, teacher_sex, teacher_status, create_date, update_date, user_ids) VALUES (12, '跑龙套', 'ggg.jpg', 21, '北京市-长江影视基地-5星级豪华酒店', '男', 7, '2012-01-22 10:06:42', '2015-03-26 17:16:06', NULL);
INSERT INTO teacher(teacher_id, teacher_name, teacher_image, teacher_age, teachert_address, teacher_sex, teacher_status, create_date, update_date, user_ids) VALUES (13, '卡卡西', 'abc.jpg', 38, '日本-大阪市-火之国-木叶村', '男', 4, '2012-01-22 10:06:42', '2015-03-26 17:16:06', NULL);
INSERT INTO teacher(teacher_id, teacher_name, teacher_image, teacher_age, teachert_address, teacher_sex, teacher_status, create_date, update_date, user_ids) VALUES (14, 'BoB', 'def.jpg', 42, '美国-纽约市-街道办处105号-204', '男', 5, '2022-03-01 08:05:07', '2022-10-21 11:30:46', NULL);
INSERT INTO teacher(teacher_id, teacher_name, teacher_image, teacher_age, teachert_address, teacher_sex, teacher_status, create_date, update_date, user_ids) VALUES (36, '张三', 'zhangsan.png', 12, '浙江省-杭州市-大李屯', '男', 1, '2022-10-25 17:03:28', '2022-10-25 17:03:28', NULL);
INSERT INTO teacher(teacher_id, teacher_name, teacher_image, teacher_age, teachert_address, teacher_sex, teacher_status, create_date, update_date, user_ids) VALUES (37, '张三2222', 'zhangsan.png', 12, '浙江省-杭州市-大李屯', '男', 1, '2022-10-25 17:04:29', '2022-10-25 17:04:29', NULL);


在和同行前辈交流过程中,前辈讲我的这种写法不常见,使用了内置函数,可能会存在一些坑。这种写法,我刚刚使用,大家在自己的工作中,选择性的使用。

参考文章:

  1. MySql中FIND_IN_SET()函数用法

  1. MySQL中find_in_set()函数用法详解

  1. MYSQL中FIND_IN_SET()函数的使用(转载)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/182561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统编程中的进程的概念No.1

引言: 北京时间2023/1/28,本小编04年1月9日出生,今天第一次理解到进程的概念,所以我们接下来就学习一下什么是进程以及和进程相关的一些知识。首先我们想要了解进程以及其相关的知识,我们要先理解一下其它方面的知识&…

【2】Linux基础命令

学习笔记目录 初识Linux--入门Linux基础命令--会用Linux权限管控--懂权限Linux实用操作--熟练实战软件部署--深入掌握脚本&自动化--用的更强项目实战--学到经验云平台技术--紧跟潮流 Linux的目录结构 Linux的目录结构是一个树形结构,没有盘符这个概念&#x…

常用算法分类

按照使用场景分类排序算法,如冒泡排序,快速排序等,用于将一组数据按照特定规则排序。搜索算法,如二分查找算法,深度优先搜索算法等,用于在一组数据中查找特定元素。图论算法,如最短路径算法&…

Claude的2022年终总结——关于2022和Claude的四个问题

文章目录前言1. 我算是合格的开发者了吗2. 我算是正式的游戏人了吗3. 我算是成熟的社会人了吗4. 我算是什么样的写作者呢最后前言 2022年的这个时候,我也是在准备着年终总结,只不过应公司要求,准备述职晋升,是抱着升职加薪&#…

行为型模式 - 命令模式Command

模式的定义与特点 命令模式(Command Pattern),是将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。命令模式是把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方…

设计一个消息队列的思考点

导图所以主要考虑的点是:P1.1. MQ 要有基础的消息管理能力(CRUD)P1.2. MQ 要有产消日志P2. MQ将消息存储成功才能响应成功P3.1 MQ将消息存储 分片存储P3.2 扩容的实现思路(如何在扩容的时候更方便高效)P4.1 数据要有副本(分片副本…

【27】C语言 | 指针进阶

目录 一、指针概念 二、字符指针 三、指针数组 四、数组指针 五、数组参数、指针参数 六、函数指针 七、函数指针数组 八、回调函数 一、指针概念 1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间。2.指针的大小是固定的4/8个字节(32位平…

Java ccflow 代码

草稿规则目录概述需求:设计思路实现思路分析1.URL管理参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happ…

盖子的c++小课堂——第十四讲:指针

前言 作者:大家好鸭,想必大家看到标题都有感到有一丝奇怪吧,其实,今天主要讲一些运算符 粉丝:啊……嗯嗯嗯 作者:那开始吧~~ 内存地址运算符& 粉丝:讲这个干嘛,我都会了~~ …

Jmeter场景组合测试——多个线程组的设计方案

我们绝大多数同学在使用jmeter进行性能测试时都会在一个线程组中完成测试工作,今天我来重点讲解一下jmeter多个线程组在测试中的应用,这也是关于jmeter性能测试面试过程中的进阶问题,希望能够帮到大家来解决工作中不同的测试需求。线程组中的…

Rust个人学习之有意思的所有权

在Rust中是没有内存垃圾回收机制(GC)的,那Rust是如何保障内存安全的呢?这就引出了“所有权”这个概念。 我们看下下面这段伪代码 let s "helloString"; t s; print(s); 在之前我们学习的语言中,比如C语言,对于上述伪…

人工智能原理复习 | 产生式系统

文章目录 一、概述二、八数码问题三、特殊的产生式系统四、一些补充CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 通过学习人工智能原理课程了解基本的人工智能问题的求解方法和原理。 一、概述 产生式系统(Production System):是构造知识型系统和建立认知模型时常用的知…

用canvas绘制微信小程序海报页面并保存相册-适用微信原生

微信小程序绘制海报并保存相册 tip:代码中使用的是uni的api 如果使用原生微信小程序开发,可以把uni更换成wx使用 文章目录微信小程序绘制海报并保存相册前言一、分析需求二、准备数据三、编码开始html部分解析:js部分1、准备好数据后开始绘制…

王道操作系统笔记(三)———— 处理机调度

文章目录一、调度的概念1.1 调度的基本概念1.2 调度的层次1.3 补充:七状态模型二、调度的时机、切换与过程2.1 进程调度的时机2.2 狭义进程调度、进程切换、广义进程调度2.3 进程切换的过程2.4 补充:闲逛进程三、进程的调度方式四、调度算法的评价指标五…

【通信原理(含matlab程序)】实验四 升余弦滚降基带传输

💥💥💞💞欢迎来到本博客❤️❤️💥💥 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识,如果大家喜欢,别忘点个赞加个关注哦,让我们一起共同进步~ &#x…

【Novel AI】使用绘画AI构建unity游戏资源

请勿在商业用途中使用下面的示例图中的任何资源! 1. 设想: 首先根据自己的设想,创造一些角色原型,角色特点等等 这里我根据网络上找的一些参考,我大概想要的是比较特别的一个警察的猫人形的动物角色; 2…

网络编程(TCP+UDP)(1)

咱们的一个TCP服务器,是否可以让一个UDP客户端连接上呢? 1)TCP和UDP,他们无论是API代码,还是协议底层的工作过程,都是差异巨大的,不是单纯的把流转化成数据包就可以的; 2)描述一次通信&#xff…

武器系统中的自主性(国防部指令3000.09)

批准:负责政策的国防部副部长办公室2023年1月25日可以公开发布。可在指令司网站https://www.esd.whs.mil/DD/查阅。国防部指令3000.09,“武器系统中的自主性”,2012年11月21日国防部副部长凯瑟琳希克斯(Kathleen H. Hicks)目的:本指令:•建立开发和使用武…

教育数字化转型 看低代码怎么构建实现

数字经济和数字社会的发展,推动教育培养目标和内容的发展与变革。经过教育信息化1.0和2.0的建设,我国数字技术与教育经历了起步、应用、融合、创新四个阶段,目前正处于融合与创新并存的时期。教育数字化教育数字化转型是教育信息化的特殊阶段…

C 程序设计教程(20)—— 数组和指针(三):数组与指针的关系

C 程序设计教程(20)—— 数组和指针(三):数组与指针的关系 该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用…