在 mysql 上加入多个复杂的表格
joining multiple complicated tables on mysql
我正在尝试查找对问题 "platform" (id 1) 回答 'facebook' 的所有客户
每个客户都有调查问卷,我正在尝试寻找回答 "facebook" 问题的客户 "platform" 问题的 id 是固定的,例如 "platform" 问题的 id table 是 1 , "age" 是 2 等等。每个问卷都有不同的问题集,例如问卷 id 1 有问题 "platform" 但答案将通过选择框而不是文本框输入(因此具有需要 answer_option table) 和问卷 ID 2 可能没有问题平台等。来自搜索屏幕的参数是问卷 ID 和回答问题的文本 "platform".
目前这就是我目前所拥有的..
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%');
如果您注意到 question.id 将始终为 1,因为我只是在平台中寻找答案,这是我的屏幕的一个特殊功能。
我用 1 - 20 行数据尝试了它,它可以工作,但如果数据变得像 20,000 行一样大,它永远不会 returns 我已经用真实数据尝试过的记录查询永远需要取消它。由于问题 id 已经是常量并且问卷 id 来自搜索参数,我想也许我不需要加入不必要的 table 并且我认为放置索引不会有帮助,因为我有一个通配符参数? (不确定),但我不知道如何。
示例数据和预期结果
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>,
我们将不胜感激。
您正在加入几个不必要的表。您没有使用 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'
我正在尝试查找对问题 "platform" (id 1) 回答 'facebook' 的所有客户
每个客户都有调查问卷,我正在尝试寻找回答 "facebook" 问题的客户 "platform" 问题的 id 是固定的,例如 "platform" 问题的 id table 是 1 , "age" 是 2 等等。每个问卷都有不同的问题集,例如问卷 id 1 有问题 "platform" 但答案将通过选择框而不是文本框输入(因此具有需要 answer_option table) 和问卷 ID 2 可能没有问题平台等。来自搜索屏幕的参数是问卷 ID 和回答问题的文本 "platform".
目前这就是我目前所拥有的..
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%');
如果您注意到 question.id 将始终为 1,因为我只是在平台中寻找答案,这是我的屏幕的一个特殊功能。 我用 1 - 20 行数据尝试了它,它可以工作,但如果数据变得像 20,000 行一样大,它永远不会 returns 我已经用真实数据尝试过的记录查询永远需要取消它。由于问题 id 已经是常量并且问卷 id 来自搜索参数,我想也许我不需要加入不必要的 table 并且我认为放置索引不会有帮助,因为我有一个通配符参数? (不确定),但我不知道如何。
示例数据和预期结果
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>,
我们将不胜感激。
您正在加入几个不必要的表。您没有使用 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'