create table course1 ( id INTEGER );
create table course2 ( id INTEGER );
create table course3 ( id INTEGER );
create table compatible ( id1 INTEGER, id2 INTEGER );
select distinct c1.id, c2.id, c3.id
from course1 c1
INNER JOIN compatible p1 on p1.id1 = c1.id
INNER JOIN course2 c2 on p1.id2 = c2.id
INNER JOIN compatible p2 on p2.id1 = c2.id
INNER JOIN course3 c3 on p2.id2 = c3.id
where exists ( select * from compatible p3 where p3.id1 = c1.id and p3.id2 = c3.id )
Это действительно не так гибко, и хотя оно должно быть быстрее, чем полное сканирование (пока индексируются идентификаторы), это потребует 2 ^ n ограничений, поэтому не подходит для большого количества курсов,Обратите внимание, что важен попарный порядок совместимой таблицы.
Вы можете повысить производительность своего решения php, используя хеш-таблицы и вложенные списки.Измените структуру вашего второго массива на
array (
122 => array( 235, 456, 654, 321),
235 => array( 654...
, тогда подход с использованием грубой силы может быть гораздо более эффективным (полное сканирование списка не требуется).Это должно быть похоже на производительность SQL-подход.Конфликты могут быть определены путем пересечения списка на меньших подмножествах.