Структура данных MySQL для вопросов, требующих множественного ввода, чтобы быть правдой

0

Извиняюсь за титул, поскольку я немного не уверен, как правильно это сформулировать, поэтому, надеюсь, пример может помочь.

У меня есть таблица MySQL, в которой есть вопросы

  question_id, PK Int
  text - Text

У меня также есть таблица, называемая значением, которая выглядит так:

  value_id, PK Int
  value - varchar

Я думаю, мне может понадобиться таблица сопоставления для этого в соответствии с

  question_to_value
  question_id int
  value_id int

Хотя, если мой пример выглядит так, как будто мне он не нужен, я могу изменить структуру

В принципе, учитывая один или несколько значений value_ids, я хочу выбрать вопрос, который следует задать

поэтому, если мне присваивается value_ids 1,2, у меня должен быть уникальный question_id, связанный с этими идентификаторами в базе данных. При значении value_id из 3 должен быть другой question_id, а вход value_ids (1,2,3) или 1,3 должен снова извлекать уникальные question_ids для обеих перестановок.

Я борюсь за то, как я должен это делать. Должен ли я использовать a) своего рода таблицу соединений для этого и b) Наиболее эффективный способ запроса.

value_id подумал, что у него есть таблица question_to_value, содержащая question_id и value_id на основе 1-1, затем делая следующее

select question_id from question WHERE value_id in (?,?,?) но я не уверен, что это оптимальный способ структурирования этого. Тем более, что проблема связана с запросом "IN" выше, если мне присваивается значение value_id из 1, это фактически возвращает все вопросы, где value_id "1" является единственной или частью группы значений для продукта определенного вопрос. например

 question_id 1 maps to value 1
 question_id 2 maps to values of 1 and 2.

my in statement возвратит question_ids 1 и 2 для value_id из 1, когда мне нужен только question_id 1, поскольку он должен соответствовать всем критериям.

Любые идеи о том, как я должен это структурировать?

*** редактирование. Я пытаюсь придумать другой способ сформулировать это, чтобы избежать путаницы, поэтому, надеюсь, следующее поможет

у меня есть 4 вопроса "

a b c d

Если мне дан ввод 1, я хочу только получить. Если мне дано 2 входа 1 и 2, я хочу только получить b. Если мне дано 3 входа 1,2,3, я хочу только получить c. Если мне дают 2 входа 1 и 3, я хочу только получить d.

  • 0
    Ваш вопрос очень запутанный или, по крайней мере, так, как вы его написали. Пожалуйста, пересмотрите больше примеров и ваш текущий подход. что вы подразумеваете под "если мне дадут value_ids 1,2, у меня будет [a] ?? question_id, который следует задать"
  • 0
    Я попытался немного привести в порядок, но, как я уже сказал, я изо всех сил пытался объяснить это сам. Идея состоит в том, что с учетом перестановки value_ids я должен быть в состоянии получить уникальный идентификатор question_id. Поэтому, если мне присвоено значение value_ids, равное 1,2, я могу запросить значение question_id, которое должно быть возвращено, если ОБА эти значения заданы. Если мне просто присвоено значение value_id, равное 1, тогда я должен получить другой вопрос_id, равный 1,2 (даже если значение value_id равно 1 в обоих запросах). Да, и может быть передано различное количество значений value_ids. Так что в некоторых случаях это может быть 1 или 3 или 5, скажем.
Показать ещё 5 комментариев
Теги:
database

1 ответ

1
Лучший ответ

Я пытаюсь разбить проблему на части, чтобы определить вопрос таким образом, который может быть выражен в коде.

Я работаю над тем, что правильный вопрос должен соответствовать двум правилам:

  1. Вопрос должен содержать запись для каждого из входных значений
  2. Вопрос не должен содержать записей для любого другого входного значения

Сначала рассмотрим запрос, который возвращает все значения id для входов.

SELECT value_id from values where 'value' IN <inputs>

Я не знаю, какой язык вы используете, поэтому я не могу рассказать вам, как создать список входов. В php это будет что-то вроде:

"('" . implode("','" $inputs) . "')"

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

Теперь просто использовать этот запрос для создания запроса, который возвращает вопросы, которые имеют ЛЮБОЙ из входных значений:

SELECT question_id 
    FROM mapping_table 
    WHERE value_id IN (SELECT value_id from values where 'value' IN <inputs>)

Наконец, мы можем настроить этот запрос, чтобы возвращать question_ids только с правильным количеством совпадений. Нам нужна одна строка для каждого вопроса, и нам нужны только вопросы, соответствующие всем значениям:

SELECT question_id 
    FROM mapping_table 
    WHERE value_id IN (SELECT value_id from values where 'value' IN <inputs>)
    GROUP BY question_id
    HAVING COUNT(question_id) = <number of inputs>

Это даст вам список question_ids, которые соответствуют ограничению 1 выше. Он не будет проверять ограничение 2 в каждом случае; если вход равен (1,2), то это будет соответствовать вопросу для (1,2) и вопроса для (1,2,3).

Однако, если вы получите только одну строку из этого запроса, нет необходимости фильтровать этот список со вторым запросом.

Если вы получили более одного совпадения для вышеуказанного, второй запрос довольно прост - он похож на указанный выше запрос, но с другим предложением WHERE. Это позволит получить все записи таблицы отображения для идентификаторов из первого запроса и сопоставить те, которые не имеют никаких дополнительных функций:

SELECT question_id
    FROM mapping_table
    WHERE question_id IN <ids from first query>
    GROUP BY question_id
    HAVING COUNT(question_id) = <number of inputs>

Вы могли бы объединить два запроса, но если производительность не является проблемой, я бы сохранил их отдельно, чтобы упростить работу.

ПРИМЕЧАНИЕ. Здесь нет ничего, чтобы ограничить ваши данные, чтобы убедиться, что они действительны. Другими словами, нет ничего, чтобы предотвратить совпадение двух вопросов (1,2), когда вопросы добавляются в базу данных.

Ещё вопросы

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