объединение нескольких сложных таблиц на MySQL - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь найти всех клиентов, которые ответили «Facebook» на вопрос «платформа» (id 1) enter image description here

у каждого клиента есть анкеты, и я пытаюсь посмотретьдля клиентов, которые ответили «facebook» на вопросы «платформа», идентификатор вопросов фиксирован, например, «платформа», идентификатор в таблице вопросов равен 1, «возраст» равен 2 и т. д. Каждый вопросник имеет различный набор вопросов, например, например, идентификатор вопросника.1 содержит вопрос «платформа», но ответ будет вводиться через поле выбора, а не текстовое поле (таким образом, имеется необходимость в таблице answer_option), а идентификатор вопросника 2 может не иметь платформы вопроса и т. Д. Параметры, которые будут поступать с экрана поиска,идентификатор анкеты и текст, который отвечает на вопрос «платформа».

сейчас это то, что у меня есть до сих пор ..

SELECT customers.* FROM customers
INNER JOIN questionnaire_answers
ON questionnaire_answers.answerable_id = customers.id
AND questionnaire_answers.answerable_type = 'Customer'
INNER JOIN questionnaires
ON questionnaires.id = questionnaire_answers.questionnaire_id
INNER JOIN questions
ON questions.questionnaire_id = questionnaires.id
INNER JOIN answers
ON answers.question_id = questions.id
INNER JOIN answer_options
ON answer_options.id = answers.answer_option_id
WHERE (questions.id = 1 and answers.answer LIKE '%facebook%');

, если вы заметите, вопрос.id будет всегда1, потому что я просто ищу ответы на платформе, это особая функция моего экрана.Я попробовал это с 1 - 20 строками данных, но это работает, но если данные становятся больше, чем 20 000 строк, они никогда не возвращают запись, которую я уже пробовал, с реальными данными, которые запрос требует навсегда, что мне нужно было отменить.Поскольку идентификатор вопроса уже постоянен, а идентификатор вопросника исходит из параметра поиска, я думаю, возможно, мне не нужно присоединять ненужную таблицу, и я не думаю, что размещение индекса поможет, потому что у меня есть параметр с подстановочными знаками? (Не уверен), но я не могу понять, как.

пример данных и ожидаемый результат

Customer:
 id:1,
 family_name: "smith",
 first_name: "smith",
..
Customer:
 id:2,
 family_name: "david",
 first_name: "david",
..

QuestionnaireAnswer:
  id: 20199,
  questionnaire_id: 4,
  answerable_type: "Customer",
  answerable_id: "1",
QuestionnaireAnswer:
  id: 20200,
  questionnaire_id: 5,
  answerable_type: "Customer",
  answerable_id: "2",

Questionnaire:
  id: 4,
  name: "Survey for Psychology Students",
  group_code: "10",
Questionnaire:
  id: 5,
  name: "Survey for Students",
  group_code: "10",

Question:
  id: 1,
  name: "platform",
  answer_type: "08", //selectbox
  default_text: nil,
  sequence: 1,
  question_valid: true,
  disabled: false,
  questionnaire_id: 5,
  ...
Question:
  id: 2,
  name: "school",
  answer_type: "01", //textbox
  default_text: nil,
  sequence: 2,
  question_valid: true,
  disabled: false,
  questionnaire_id: 5,
  ...

Question:
  id: 3, // I said the the id for platform is fixed but this time this question is textbox inputted so it is different
  name: "platform",
  answer_type: "01", //text
  default_text: nil,
  sequence: 1,
  question_valid: true,
  disabled: false,
  questionnaire_id: 5,
  ...
Question:
  id: 4,
  name: "town",
  answer_type: "01", //textbox
  default_text: nil,
  sequence: 2,
  question_valid: true,
  disabled: false,
  questionnaire_id: 4,
  ...

Answer:
  id: 1,
  question_id: 3,
  answer_option_id: nil,
  answer: "facebook",
  questionnaire_answer_id: 19585,
  created_at: Wed, 13 Feb 2019 21:43:15 JST +09:00,
  updated_at: Wed, 13 Feb 2019 21:43:15 JST +09:00,
  member_id: nil>,

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 14 февраля 2019

Вы объединяетесь с несколькими ненужными таблицами.Вы не используете ничего из answer_options, поэтому вам это не нужно.И answers имеет внешние ключи для questionnaire_answers и questions, поэтому вам не нужно questionnaires.

SELECT customers.* 
FROM customers AS c
INNER JOIN questionnaire_answers AS qa
ON qa.answerable_id = c.id
INNER JOIN answers AS a
ON a.questionnaire_answers_id = qa.id
INNER JOIN questions AS q
ON q.id = a.question_id
WHERE q.id = 1
    AND a.answer LIKE '%facebook%'
    AND qa.answerable_type = 'Customer'
...