mysql - 请问一个多对多的SQL查询
PHP中文网
PHP中文网 2017-04-17 13:24:42
[MySQL讨论组]

表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。

PHP中文网
PHP中文网

认证0级讲师

全部回复(3)
阿神

select id from programmer where id not in (select p_id from programmer_language_map where l_id not in (1,2,3))

怪我咯
SELECT distinct(a.id) FROM programmer as a ,programmer_languege_map as b
WHERE a.id = b.programmerId AND b.languegeId IN [1,2,3]

但是以上语句有明显性能问题,不建议使用

黄舟
select plm.pid, p.name from programmer_language_map as plm
left join programmer as p on plm.pid=p.pid
left join language as l on p.lid=l.lid
where l.lan in (1,2,3)
group by plm.pid, p.name
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号