假设以下 professor_school 表:
professorid, schoolid
1,1
2,1
3,1
4,1
1,2
2,2
5,2
1,3
5,3
...
如果可能,我如何使用单个查询来选择与任意数量的学校相关的每位教授?
我的输入参数将是一个未知大小的数组,上面有学校ID的列表,我需要所有这些ID中的所有教授ID。
示例:
input 1 - output 1,2,3,4
input 1,2 - output 1,2
input 1,2,3 - output 1
input 2,3 - output 1,5
我认为我无法进行内部自连接,因为输入参数的数量可能是可变的,我目前的解决方案是按和进行分组,所以
select count(*) as c, professorid from professor_school where schoolid in (1,2,3) group by (professorid) having c=3;
问题是,这是唯一/最佳解决方案吗?有没有更有效的选择?
PS:我意识到问题的标题并不好,但是我想不出更好的表达方式。
答案 0 :(得分:0)
不,这不是唯一的解决方案。如果您使用MariaDB,则可以使用INTERSECT
:
SELECT profesorid FROM professor_school WHERE schoolid = 1
INTERSECT
SELECT profesorid FROM professor_school WHERE schoolid = 2
INTERSECT
SELECT profesorid FROM professor_school WHERE schoolid = 3
在您的示例中,如果您对列(profesorid / schoolid)没有DISTINCT
约束,我还将添加UNIQUE
:
select count(distinct schoolid) as c, professorid
from professor_school
where schoolid in (1,2,3)
group by (professorid)
having c=3;
或者:
select professorid
from professor_school
where schoolid in (1,2,3)
group by (professorid)
having count(distinct schoolid)=3;