У нас есть таблица, которую мы используем для хранения ответов на вопросы. Мы должны быть в состоянии найти пользователей, которые имеют определенные ответы на конкретные вопросы. Итак, если наша таблица состоит из следующих данных:
user_id question_id answer_value
Sally 1 Pooch
Sally 2 Peach
John 1 Pooch
John 2 Duke
и мы хотим найти пользователей, которые ответят «Pooch» на вопрос 1 и «Peach» на вопрос 2, следующий SQL (очевидно) не будет работать:
select user_id
from answers
where question_id=1
and answer_value = 'Pooch'
and question_id=2
and answer_value='Peach'
Моей первой мыслью было самостоятельное присоединение к таблице для каждого ответа, который мы ищем:
select a.user_id
from answers a, answers b
where a.user_id = b.user_id
and a.question_id=1
and a.answer_value = 'Pooch'
and b.question_id=2
and b.answer_value='Peach'
Это работает, но поскольку мы допускаем произвольное количество поисковых фильтров, нам нужно найти что-то гораздо более эффективное. Моим следующим решением было что-то вроде этого:
select user_id, count(question_id)
from answers
where (
(question_id=2 and answer_value = 'Peach')
or (question_id=1 and answer_value = 'Pooch')
)
group by user_id
having count(question_id)>1
Тем не менее, мы хотим, чтобы пользователи могли сдавать один и тот же вопросник дважды, чтобы у них могло быть два ответа на вопрос 1 в таблице ответов.
Итак, теперь я в растерянности. Какой лучший способ подойти к этому? Благодарность!
источник
Мне нравится метод join, я сам:
Обновление После тестирования с таблицей большего размера (~ 1 миллион строк) этот метод занял значительно больше времени, чем простой
OR
метод, упомянутый в исходном вопросе.источник
Мы присоединение к
user_id
изanswers
таблицы в цепочке объединений , чтобы получить данные из других таблиц, но изолировать ответ таблицу SQL и запись его в таких простых условиях помогли мне определить решение:Мы без необходимости использовали второй подзапрос.
источник
Если у вас большой набор данных, я бы сделал два индекса:
Вам нужно будет присоединиться несколько раз из-за того, как организованы данные. Если вы знаете, какое значение для какого вопроса является наименее распространенным, вы можете немного ускорить запрос, но оптимизатор должен сделать это за вас.
Попробуйте запрос как:
Таблица a1 должна использовать первый индекс. В зависимости от распределения данных оптимизатор может использовать любой индекс. Весь запрос должен быть выполнен из индексов.
источник
Один из способов подойти к этому - получить подмножество user_id и проверить их на второе совпадение:
Используя структуру Роландо:
Урожайность:
источник