2012-02-15 6 views
0

Я создаю систему онлайн-опроса, для которой я хочу создать статистику. Я хочу получить запрос на основе пола пользователя. У меня есть следующие таблицы:SQL Присоединяется к нескольким таблицам

  • survey_question_options
  • survey_answer
  • пользователи

я построил следующий запрос так, чтобы он возвращает пустой ответ, где нет ни одного ответа на вопрос:

SELECT COUNT(sa.option_id) AS answer , so.option_label 
FROM survey_answer sa 
RIGHT JOIN survey_question_options so 
     ON sa.option_id = so.option_id AND 
      sa.record_date>='2011-09-01' AND 
      sa.record_date<='2012-08-01' 
LEFT JOIN users u 
     ON (sa.uid = u.uid AND u.gender='F') 
WHERE so.question_id=24 
GROUP BY so.option_label 
ORDER BY so.option_id ASC 

Мой запрос возвращает следующие результаты:

0 Red 
1 Yellow 
0 Blue 
0 Green 

Однако условие пола в LEFT JOIN, по-видимому, игнорируется в запросе. Когда я меняю пол на «М», возвращается тот же результат. Однако ожидаемый результат будет 0 для всего.

Я не уверен, где я ошибаюсь. Пожалуйста помоги.

Заранее спасибо.

ответ

0

Левые присоединиться к таблице пользователей оценивается после объединения к столу ответа - так что, хотя запись пользователя не возвращается, если пользователь неправильно пол, запись ответа будет быть возвращен (независимо от того, пол пользователя). Попробуйте:

SELECT COUNT(sa.option_id) AS answer , so.option_label 
FROM (select a.option_id 
     from survey_answer a 
     JOIN users u ON a.uid = u.uid AND u.gender='F' 
     where a.record_date>='2011-09-01' AND 
      a.record_date<='2012-08-01') sa 
RIGHT JOIN survey_question_options so 
     ON sa.option_id = so.option_id 
WHERE so.question_id=24 
GROUP BY so.option_label 
ORDER BY so.option_id ASC 
1

Ну, вы делаете COUNT на колонке из основной таблицы, поэтому пол условие на LEFT JOIN не будет влиять на результат. Вы должны сделать COUNT в столбце таблицы users. Я не уверен, что это то, что вы хотите, но вы должны попробовать:

SELECT COUNT(u.uid) AS answer , so.option_label 
FROM survey_answer sa 
RIGHT JOIN survey_question_options so 
     ON sa.option_id = so.option_id AND 
      sa.record_date>='2011-09-01' AND 
      sa.record_date<='2012-08-01' 
LEFT JOIN users u 
     ON (sa.uid = u.uid AND u.gender='M') 
WHERE so.question_id=24 
GROUP BY so.option_label 
ORDER BY so.option_id ASC 
0

Вы помещаете свое состояние в неправильный блок. Так как вы выполняете команду LEFT JOIN (которая связана с левой стороной , внешняя связь), все в левой таблице (основной таблице) выбирается вместе с данными из объединенной таблицы , где это применимо. Вы хотите добавить данные от всеusers, а затем ограничить полный вывод запроса. То, что вы на самом деле сделали, - это добавить пользовательские данные только от женщин-пользователей, а затем отобразить все данные.

Звучит технически, но все, что вам нужно сделать, это переместить AND u.gender='F' в основное предложение WHERE вместо статьи ON. Это заставит SQL выбрать только строки для женщин-пользователей послеJOIN.

Смежные вопросы