SQL Подзапрос - Как мне заставить это работать - MYSQL? - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь создать подзапрос. Я пытаюсь найти значение вопроса 66 для группы людей, которые ответили любой из следующих фраз (например, «Аутизм») на вопросы 205/227 / 278.

Я не могу получить чтобы это работало, кто-нибудь сможет посоветовать, где я слишком усложняю или ошибаюсь?

select texter_survey_response.conversation_id
from texter_survey_response
join texter_survey_response_value on texter_survey_response_value.response_id = 
texter_survey_response.response_id
where texter_survey_response_value.question_id = 66
  (select texter_survey_response_value.value
  from texter_survey_response_value
  where texter_survey_response_value.question_id IN (205, 227, 278)
  and texter_survey_response_value.value ilike '%Autism%'
  or texter_survey_response_value.value ilike '%ASD%'
  or texter_survey_response_value.value ilike '%Autistic%'
  or texter_survey_response_value.value ilike '%Aspergers%'
  or texter_survey_response_value.value ilike '%Asperger%'
  or texter_survey_response_value.value ilike '%Autism Spectrum%'
  or texter_survey_response_value.value ilike '%Autistic Spectrum Disorder%'
  or texter_survey_response_value.value ilike '%Autistic Spectrum%')

Я работаю с SQL на Periscope (MySQL).

Спасибо.

1 Ответ

2 голосов
/ 23 января 2020

Первая ошибка в вашем запросе здесь:

where texter_survey_response_value.question_id = 66
  (select texter_survey_response_value.value

Пожалуйста, попробуйте объяснить, что вы планируете здесь делать, сравнить exter_survey_response_value.question_id с 66 или с результатом подзапроса?

Также я заметил, что вы используете ключевое слово ilike, а не как !!

Далее я заметил, что некоторые подобные строки можно превратить в одну строку :

or texter_survey_response_value.value like '%Aspergers%'
or texter_survey_response_value.value like '%Asperger%'

И это также:

or texter_survey_response_value.value like '%Autistic Spectrum Disorder%'
or texter_survey_response_value.value like '%Autistic Spectrum%'
or texter_survey_response_value.value like '%Autistic%'

И это:

texter_survey_response_value.value like '%Autism%'
texter_survey_response_value.value like '%Autism Spectrum%'

Как Акина уже прокомментировала ваш вопрос ...

Таким образом, все эти 7 строк кода можно заменить на:

texter_survey_response_value.value like '%Autism%'
or texter_survey_response_value.value like '%Autistic%'
or texter_survey_response_value.value like '%Asperger%'

И когда вы ответите мне на мой вопрос в верхней части этого ответа, я могу помочь вам больше .. .

Также вы можете использовать псевдонимы для своих таблиц, и вы должны использовать операнд IN для сравнения значений с несколькими значениями, которые вы получите из подзапроса.

select tsr.conversation_id
from texter_survey_response tsr
join texter_survey_response_value tsrv on tsrv.response_id = tsr.response_id
where tsr.question_id = 66
and tsrv.value in
(select tsrv1.value
 from texter_survey_response_value tsrv1
 where tsrv1.value like '%Autism%'
 or tsrv1.value like '%Autistic%'
 or tsrv1.value like '%Asperger%')

Также я не делаю вижу необходимость в подзапросе. Вы можете сделать это следующим образом:

select tsr.conversation_id
from texter_survey_response tsr
join texter_survey_response_value tsrv on tsrv.response_id = tsr.response_id
where tsr.question_id = 66
and tsrv.value like '%Autism%'
 or tsrv.value like '%Autistic%'
 or tsrv.value like '%Asperger%';

После некоторого обсуждения в чате с ОП я написал этот запрос:

select tsr.conversation_id
from texter_survey_response tsr
join texter_survey_response_value tsrv on tsrv.response_id = tsr.response_id
where tsrv.question_id = 66
and tsrv.response_id in (select tsrv2.response_id
                         from texter_survey_response tsr2
                         left join texter_survey_response_value tsrv2
                         on tsrv2.response_id = tsr2.response_id
                         where tsr2.question_id in (205, 227, 278)
                         and tsrv2.value like '%Autism%'
                         or tsrv2.value like '%Autistic%'
                         or tsrv2.value like '%Asperger%');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...