一对多查询,多的一方有多条记录同时满足情况的查询SQL

将这个条件写在最后,使用 having find_in_set(#{you_field},group_concat(多的一方对应的字段));

创建一个用户表

 

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id自增主键',
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名',
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码',
  `mobile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '手机号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

创建一个学科表

create table t_subject(
	`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id自增主键',
  `subject_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学科名',
  `subject_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学科信息',
	  PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

创建一个学科记录表

create table t_subject_log (
	`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id自增主键',
  `subject_id` int(11)  NOT NULL COMMENT '学科id',
  `user_id` int(11)  NOT NULL COMMENT '用户id',
	  PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

插入一些记录

INSERT INTO `test`.`t_user`(`id`, `username`, `password`, `mobile`) VALUES (1000, '张三', 'zhangsan', '188');
INSERT INTO `test`.`t_user`(`id`, `username`, `password`, `mobile`) VALUES (1001, '李四', 'lisi', '199');
INSERT INTO `test`.`t_user`(`id`, `username`, `password`, `mobile`) VALUES (1002, '王五', 'wangwu', '100');
INSERT INTO `test`.`t_user`(`id`, `username`, `password`, `mobile`) VALUES (1003, '赵六', 'zhaoliu', '111');
INSERT INTO `test`.`t_user`(`id`, `username`, `password`, `mobile`) VALUES (1004, '芳芳', 'fangf', '122');
INSERT INTO `test`.`t_subject`(`id`, `subject_name`, `subject_desc`) VALUES (1, '语文', '语文课呀呀呀呀');
INSERT INTO `test`.`t_subject`(`id`, `subject_name`, `subject_desc`) VALUES (2, '数学', '数学课呀呀呀');
INSERT INTO `test`.`t_subject`(`id`, `subject_name`, `subject_desc`) VALUES (3, '英语', '英语课呀呀呀');
INSERT INTO `test`.`t_subject`(`id`, `subject_name`, `subject_desc`) VALUES (4, '生物', '生物课呀呀呀');
INSERT INTO `test`.`t_subject`(`id`, `subject_name`, `subject_desc`) VALUES (5, '地理', '地理课呀呀呀');
INSERT INTO `test`.`t_subject`(`id`, `subject_name`, `subject_desc`) VALUES (6, '政治', '政治课呀呀呀呀');

INSERT INTO `test`.`t_subject_log`( `subject_id`, `user_id`) VALUES 
(1, 1000),
(1, 1001),
(1, 1002),
(1, 1004),
(2, 1000),
(3, 1000),
(4, 1000),
(5, 1000),
(6, 1000),
(2, 1001);

查询学科记录有语文和数学的学生

select
	tu.id,
	tu.username,
	tu.mobile,
	tsl.subject_id
from t_user tu LEFT JOIN t_subject_log tsl
on tu.id = tsl.user_id
GROUP BY tu.id HAVING FIND_IN_SET(1,GROUP_CONCAT(tsl.subject_id))>0 and FIND_IN_SET(2,GROUP_CONCAT(tsl.subject_id))>0

尝试一下吧

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值