表1、programmer (程序员表)
表2、language (编程语言表)
表3、programmer_language_map (映射表,即某个程序员会哪些语言)
查询出除了1,2,3以外不会其他编程语言的程序员集合,也就是符合条件的程序员可以只会编程语言1,可以会1/2/3三个语言,也可以什么都不会,但是不能会编程语言4(即超出1/2/3范围)。
这种需求能用一条SQL查询语句实现吗?
CREATE TABLE `programmer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
)
INSERT INTO `programmer` VALUES ('1');
INSERT INTO `programmer` VALUES ('2');
INSERT INTO `programmer` VALUES ('3');
INSERT INTO `programmer` VALUES ('4');
INSERT INTO `programmer` VALUES ('5');
CREATE TABLE `language` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)
INSERT INTO `language` VALUES ('1', 'Java');
INSERT INTO `language` VALUES ('2', 'C#');
INSERT INTO `language` VALUES ('3', 'C++');
INSERT INTO `language` VALUES ('4', 'JavaScript');
INSERT INTO `language` VALUES ('5', 'Python');
CREATE TABLE `programmer_language_map` (
`p_id` int(11) NOT NULL,
`l_id` int(11) NOT NULL,
PRIMARY KEY (`p_id`,`l_id`)
)
INSERT INTO `programmer_language_map` VALUES ('1', '3');
INSERT INTO `programmer_language_map` VALUES ('1', '4');
INSERT INTO `programmer_language_map` VALUES ('2', '3');
表结构和初始的数据贴上。
需要的查询结果是programmer中的2/3/4/5。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
select id from programmer where id not in (select p_id from programmer_language_map where l_id not in (1,2,3))
但是以上语句有明显性能问题,不建议使用