Извиняюсь за титул, поскольку я немного не уверен, как правильно это сформулировать, поэтому, надеюсь, пример может помочь.
У меня есть таблица 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.
Я пытаюсь разбить проблему на части, чтобы определить вопрос таким образом, который может быть выражен в коде.
Я работаю над тем, что правильный вопрос должен соответствовать двум правилам:
Сначала рассмотрим запрос, который возвращает все значения 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), когда вопросы добавляются в базу данных.