Предполагая следующую таблицу Professor_school:
professorid, schoolid
1,1
2,1
3,1
4,1
1,2
2,2
5,2
1,3
5,3
...
Как я могу, используя один запрос, по возможности выбрать каждого профессора, который связан с любым количеством школ?
Мои входные параметры были бы массивом неизвестного размера со списком школьных идентификаторов, и мне нужны все идентификаторы профессора, которые есть у всех.
Примеры:
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: Я понимаю, что заголовок вопроса невелик, но я не могу придумать лучшего способа его выразить.
Нет, это не единственное решение. Если вы используете 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
В вашем примере я бы также добавил DISTINCT
если у вас нет ограничения UNIQUE
для столбцов (profesorid/schoolid):
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;