Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
有两张表,
一张为爱好表b表
一张为用户表 u表
u表
id 名称 爱好Id
1 张三 1,2,3,4
2 李四 2,5
b表
id 名称
1 打乒乓
2 打羽毛球
3 打蓝球
4 上网玩游戏
5 打牌
正常查询u表
select * from u
现在需求是:
id 名称 爱好
1 张三 打乒乓,打羽毛球,打篮球,上网
2 李四 打羽毛球,打牌
修改sql为
select u.id,u.名称,group_count(b.名称) from u left join b on find_in_set(b.id,u.爱好Id) group by u.id;
案例:
DROP TABLE IF EXISTS `sys_hobby`; CREATE TABLE `sys_hobby` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `hobby_name` varchar(8) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '爱好名称', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*Data for the table `sys_hobby` */ insert into `sys_hobby`(`id`,`hobby_name`) values (1,'篮球'),(2,'乒乓球'),(3,'羽毛球'),(4,'跑步'),(5,'读书'),(6,'钓鱼'),(7,'越野'),(8,'汽车'); /*Table structure for table `sys_user` */ DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(6) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '姓名', `hobby_id` varchar(30) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '爱好主键', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*Data for the table `sys_user` */ insert into `sys_user`(`id`,`name`,`hobby_id`) values (1,'张三','1,6'),(2,'李四','1,2,3,4,5'); /*Table structure for table `user` */ DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint NOT NULL COMMENT '主键', `name` varchar(30) DEFAULT NULL COMMENT '姓名', `age` int DEFAULT NULL COMMENT '年龄', `email` varchar(50) DEFAULT NULL COMMENT '邮箱', `manager_id` bigint DEFAULT NULL COMMENT '直属上级id', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`), KEY `manager_fk` (`manager_id`), CONSTRAINT `manager_fk` FOREIGN KEY (`manager_id`) REFERENCES `user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
SELECT su.`id`, su.`name`, GROUP_CONCAT(sh.`hobby_name`) FROM `sys_user` AS su LEFT JOIN `sys_hobby` AS sh ON FIND_IN_SET(sh.`id`, su.`hobby_id`) GROUP BY su.`id` ;
结果: