Настройка запроса кросс-листинга MySQL - PullRequest
0 голосов
/ 07 января 2011

У меня есть таблица Classes, в которой хранятся данные о разных классах колледжа (уникальный Class_ID и Department, Course и т. Д.).

Некоторые классы имеют перекрестные списки с несколькими именами.Например, один и тот же класс может быть перекрестно указан как HIST-204 (история) и AAST-103 (исследования афроамериканцев).Для одного класса может быть более двух перекрестных списков.

Я бы хотел правильно хранить перекрестные списки, чтобы при поиске учениками учебников класса (хранящихся в таблице Class_Books) с использованием любого из возможныхПерекрестные списки, они показывают необходимые книги. не важно, знают ли студенты о других перекрестных списках, когда они выполняют поиск, только то, что они получают книги для этого курса.

Я думаю сделать это путем сохраненияCross_List_ID в классах, который указывает, что данный класс является просто перекрестным списком существующего, чей Class_ID будет храниться в этом поле.Тогда мне нужно было бы только сохранить требуемую книгу (в Class_Books) для Class_ID, который был кросс-перечислен.Затем, когда учащиеся входят в класс при поиске, я обязательно включу все книги, необходимые для Cross_List_ID.Если вы согласны с этим, мне будет интересно, как бы вы настроили этот запрос (чтобы получить учебники для введенного class_id, а также его перекрестный список).

Казалось бы, еще один вариант - хранить данные Class_Books для каждого перекрестного списка. Я не хочу делать этот метод, потому что необработанные данные Class и Class-Book, которые я загружаю в базу данных, не поддаются этому,потому что есть отдельные файлы для каждого, и только один из перекрестных списков связан с Книгой в файле Class-Book.Кроме того, даже если бы этот метод был легко выполнимым, он занял бы больше места в базе данных.

Я открыт для других вариантов, если вы не согласны с моим подходом Cross_Listing_ID.Как я уже сказал, если вы согласны с таким подходом, тогда помогите мне сделать запрос!

Примечание: структура учебников - это просто Class_ID, Book_ID

1 Ответ

0 голосов
/ 07 января 2011

Если вам нужно выбрать между двумя, выберите первый вариант. Вы не хотите иметь якобы повторяющиеся записи в учебниках. Это может вызвать все виды проблем для вас.

Обновление Поскольку вы хотите, чтобы идентификатор класса был в предложении where, я его обновил.

Что касается запроса, то вот как я буду искать книги

SELECT DISTINCT books.*
FROM
    classes main
    LEFT JOIN classes crosslinked
    ON main.Class_id = crosslinked.cross_link_class_id
    LEFT JOIN class_books books
    ON main.class_id =  books.class_id
WHERE
    main.class_id= 252
    OR
    crossLinked.class_id= 252 

Но вы должны принять точку зрения ijw. Было бы гораздо лучше иметь таблицу class_names, которая связана с классом. Это было бы немного чище. Тогда вам не нужно делать логику, например: если cross_link_class_id не является нулевым, то не разрешайте студентам регистрироваться для этого, профессор не может преподавать класс с нулевым значением для cross_link_class_id .., в конце концов, вы бы не стали хотите случайно забронировать класс или удвоить количество уроков, которые преподаватель записал в качестве преподавания

Вот как это будет сделано с отдельной таблицей имен классов.

SELECT DISTINCT books.*
FROM
    classes 
    --LEFT JOIN class_names names
    --ON main.Class_id = names.Class_id 
    LEFT JOIN class_books books
    ON main.class_id =  books.class_id
WHERE
   clases.class_id  = 252 

Обратите внимание, что оператор OR пропал, и нет забавного самостоятельного объединения (которое может сбить людей с толку) и вышеупомянутая логика для пустого cross_link_class_id пропала.

Примечание: с запросом я взял некоторые вольности, например, литеральная строка будет заменена параметром. Вы не выбрали бы *, но использовали бы фактические имена полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...