Похоже, у вас должны быть следующие таблицы:
Course
- список курсов.
Subject_area
- список предметов, которые могут охватывать курсы, например, "sql", "c ++" и т. Д.
Course_content
- таблица перекрестных ссылок между Course
и Subject_area
.
Professor
- список профессоров.
Professor_expertise
- таблица перекрестных ссылок между Professor
и Subject_area
.
Например, у вас может быть профессор по имени «Браун» с соответствующей строкой в таблице Professor
, а также предметные области, называемые «sql», «java» и «алгоритмы оптимизации», в каждой из которых профессор Браун заинтересован в. Тогда будет соответствующая строка для каждой из этих областей в Professor_expertise
, и каждая будет ссылаться на строку профессора Брауна в таблице Professor
, а также соответствующую строку в таблице Subject_area
.
Теперь предположим, что у вас есть курс «SQL и проектирование баз данных», и он имеет предметные области «Разработка баз данных», «SQL», «Индексы баз данных», «Нормализация» и «Оптимизация запросов». Вы можете увидеть, какие профессора подходят для преподавания курса, выполнив
SELECT
Professor.Name,
Professor.Id,
MySubquery.NumMatches
FROM
Professor
JOIN (
SELECT
Professor,
COUNT(*) AS NumMatches
FROM
Professor_expertise
WHERE
Subject_area_id IN (
SELECT Course_content.Subject_area_Id
FROM Course_content
WHERE Course_content.Course_Id = x
)
GROUP BY
Professor
) AS MySubquery
ORDER BY
MySubquery.NumMatches DESC
где x
- идентификационный номер, соответствующий курсу.