Как я могу найти один из многих возможных шаблонов среди одной записи MySQL? Больше внутри - PullRequest
2 голосов
/ 18 февраля 2010

Мне было трудно подвести итог моего вопроса. В основном:

Есть таблица, которая называется "файлы". Файлы содержат запись под названием "оценки". Он используется для определения определенного уровня обучения, для которого файл может быть полезен. Поскольку файл может быть полезен для> 1 класса, я храню такие вещи

Если это хорошо только для 3-го класса оценки: 3

Если это хорошо для 3-го, 4-го и 5-го: оценки: 3,4,5

и т. Д. И т. Д.

Когда я собирал SQL-запрос для получения этих файлов, я столкнулся со странной проблемой - в основном пользователь может сказать: «Я хочу только то, что хорошо для 2-го и 3-го класса». Поэтому я должен искать файлы, которые имеют «2,3» в области оценок. Легко! НО!

Он также может иметь «1,2,3» или «2,3,4» или «2,4».

У меня болит голова, я просто думаю об этом. Достаточно просто проанализировать эти записи через запятую, чтобы получить «1» и «2», но каков наиболее эффективный способ сопоставить запись SQL с запросом? Кажется пустой тратой получить КАЖДУЮ ЗАПИСЬ в БД, разобрать их, а затем сопоставить снова.

Лучше ли вернуться к исходной точке и создать базу данных под названием "файлы" и отдельные таблицы для каждого класса? Это также кажется пустой тратой - написание нескольких записей для одного файла.

Какое решение здесь? Я немного сбит с толку.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2010

несколько вариантов здесь ...

1) хранить оценки как целое число, где каждая оценка соответствует биту. оценка 1 = бит 0, оценка 2 = бит 1, оценка 3 = бит 2 и т. д. тогда оценки 1,2,3 будут соответствовать 0x00000111 (8), а оценки 2,4 будут 0x00001010 (10) и т. д .; тогда запрос становится простым делом сравнения AND ... если вы хотите, чтобы были выбраны все строки, где выбраны 2 и 4 классы (и, возможно, другие), то выберите * из файлов, где (классы & 10) == true

2) если существует только относительно небольшое количество оценок, вы можете хранить каждый из них в качестве логического столбца.

3) сохранить оценки в отдельной таблице, а затем установить связь между оценками и файлами в 3-й таблице соединений (поскольку это отношение многих ко многим).

0 голосов
/ 18 февраля 2010

Чтобы уточнить, что сказал @emh. Наилучшим вариантом IMHO будет иметь таблицу оценок, которая соединяется с таблицей файлов по идентификатору файла (# 3). Затем вы можете каждый раз сохранять связь между оценкой и файлом в новой строке (если связь еще не существует)

tbl_file_grades
-----------
file_id
grade

Когда вы выполняете поиск, вы можете объединить две таблицы и отфильтровать поиск по столбцу оценок.

SELECT files.file_info FROM files
INNER JOIN tbl_file_grades ON files.file_id = tbl_file_grades.file_id
WHERE tbl_file_grades.grade = 1 AND tbl_file_grades.grade = 2 ...

Я не уверен, нужна ли дополнительная таблица для оценок. Это будет зависеть от ваших потребностей. Кажется, если ты счастлив без этого сейчас, значит, это не так уж и важно.

А также, самое главное, добро пожаловать в SO.

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