Как выбрать несколько значений из одной таблицы с условиями AND

0

Предполагая следующую таблицу 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: Я понимаю, что заголовок вопроса невелик, но я не могу придумать лучшего способа его выразить.

Теги:

1 ответ

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

В вашем примере я бы также добавил 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню