2010-11-29 2 views
0

РЕШЕНИЯ: Если кому-то интересно:MySQL JOIN проблема

SELECT login_id, hotel_name, AVG(q1) AS q1, AVG(q2) AS q2, AVG(q3) AS q3, AVG(q4) AS q4, AVG(q5) AS q5, AVG(q6) AS q6, AVG(q7) AS q7, AVG(q8) AS q8, AVG(q9) AS q9, AVG(q10) AS q10, AVG(q11) AS q11, AVG(q12) AS q12, AVG(q13) AS q13, AVG(q14) AS q14, AVG(q15) AS q15, AVG(q16) AS q16, AVG(q17) AS q17, AVG(q18) AS q18, AVG(q19) AS q19, AVG(q20) AS q20, AVG(q21) AS q21, AVG(q22) AS q22 
FROM thotels_respondents 
LEFT JOIN thotels_results ON thotels_respondents.login_id = thotels_results.company 
AND q24 =5 
AND thotels_results.date = 'NOV2010' 
AND thotels_results.brand = 'XYZ' 
WHERE 
AND login_id = '66j8ttk2' 
GROUP BY login_id 

Перемещая thotels_results.date и .бренды раньше ИНЕК решить эту проблему.

Утром все,

Надеюсь, кто-то сможет помочь - я заподозрить, что я пропустил что-то совершенно очевидное ...

У меня есть две таблицы в MySQL hotel_respondents и hotel_results - они соединены hotel_respondents.login_id = hotel_results.company

у меня есть следующие данные в таблице hotel_results:

date  brand code  q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 q16 q17 q18 q19 q20 q21 q22 q23 q24 q25 

NOV2010 XYZ 66j8ttk2 8 6 4 8 3 8 8 8 7 4 8 7 7 4 7 6 6 7 4 5 7 7 2 1 1 
NOV2010 XYZ 66j8ttk2 9 9 5 5 5 5 3 3 9 9 9 5 6 8 6 8 8 5 5 5 6 6 2 1 1 
NOV2010 XYZ 66j8ttk2 10 10 7 10 8 10 10 9 8 10 10 10 8 10 10 10 10 10 10 10 10 10 1 1 1 
NOV2010 XYZ 66j8ttk2 8 6 4 8 3 8 8 8 7 4 8 7 7 4 7 6 6 7 4 5 7 7 2 1 1 
NOV2010 XYZ 66j8ttk2 9 10 9 9 7 10 10 10 9 9 9 10 10 8 10 9 10 10 10 10 10 7 1 1 1 
NOV2010 XYZ 66j8ttk2 10 10 10 6 10 10 10 10 6 10 10 10 10 1 10 10 10 10 10 10 10 10 1 2 1 
NOV2010 XYZ 66j8ttk2 10 7 6 9 7 9 8 8 8 6 8 7 10 5 9 8 8 8 7 9 8 8 1 2 1 
NOV2010 XYZ 66j8ttk2 8 8 7 7 9 9 10 1 8 10 10 9 8 8 9 8 8 7 8 8 8 9 1 2 1 
NOV2010 XYZ 66j8ttk2 6 6 5 7 7 5 7 6 5 3 7 4 5 8 5 7 8 7 5 4 7 3 2 2 1 
NOV2010 XYZ 66j8ttk2 10 9 10 9 10 10 8 10 9 10 10 9 9 6 9 9 9 10 9 9 9 8 2 3 2 
NOV2010 XYZ 66j8ttk2 5 9 2 6 2 2 10 10 6 2 10 2 2 2 5 5 5 10 5 2 8 8 2 4 1 
NOV2010 XYZ 66j8ttk2 9 8 5 7 7 9 9 9 10 10 9 7 9 6 8 8 7 8 9 10 7 10 2 4 1 

Теперь, в Excel, я запускаю AVERAGE для каждого вопроса, где q24 = 1 и следующие результаты возвращаются.

q1  q2  q3  q4  q5  q6  q7  q8  q9  q10  q11  q12  q13  q14  q15  q16  q17  q18  q19  q20  q21  q22   
8.80 8.20 5.80 8.00 5.20 8.20 7.80 7.60 8.00 7.20 8.80 7.80 7.60 6.80 8.00 7.80 8.00 7.80 6.60 7.00 8.00 7.40 

Нет, я могу повторить результаты в MySQL, используя следующий код:

SELECT login_id, hotel_name, AVG (q1) AS q1, AVG (q2) AS q2, AVG (q3) AS q3, AVG (q4) AS q4, AVG (q5) AS q5, AVG (q6) AS q6, AVG (q7) AS q7, AVG (q8) AS q8, AVG (q9) AS q9, AVG (q10) AS q10, AVG (q11) AS q11, AVG (q12) AS q12, AVG (q13) AS q13, AVG (q14) AS q14, AVG (q15) AS q15, AVG (q16) AS q16, AVG (q17) AS q17, AVG (q18) AS q18, AVG (q19) AS q19, AVG (q20) AS q20, AVG (q21) AS q21, AVG (q22) AS q22 FROM thotels_respondents LEFT JOIN thotels_results ON thotels_respondents.login_id = thotels_results.company AND q24 = 1 WHERE thotels_results.brand = 'XYZ' AND thotels_results.date = 'NOV2010' AND login_id = '66j8ttk2' GROUP BY hotel_name; 

Проблема у меня заключается в следующем - код возвращает правильный набор результатов в MySQL, пока Q24 имеет любую из 1,2,3,4,5 в таблице. Однако, как видно из приведенных выше данных, для q24 есть NO 5.

Итак, когда вы запустите следующий код:

SELECT login_id, hotel_name, AVG (q1) AS q1, AVG (q2) AS q2, AVG (q3) AS q3, AVG (q4) AS q4, AVG (q5) AS q5, AVG (q6) AS q6, AVG (q7) AS q7, AVG (q8) AS q8, AVG (q9) AS q9, AVG (q10) AS q10, AVG (q11) AS q11, AVG (q12) AS q12, AVG (q13) AS q13, AVG (q14) AS q14, AVG (q15) AS q15, AVG (q16) AS q16, AVG (q17) AS q17, AVG (q18) AS q18, AVG (q19) AS q19, AVG (q20) AS q20, AVG (q21) AS q21, AVG (q22) AS q22 FROM thotels_respondents LEFT JOIN thotels_results ON thotels_respondents.login_id = thotels_results.company AND q24 = 5 WHERE thotels_results.brand = 'XYZ' AND thotels_results.date = 'NOV2010' AND login_id = '66j8ttk2' GROUP BY hotel_name; 

Он не возвращает никаких данных, просто это сообщение:

MySQL returned an empty result set (i.e. zero rows). (Query took 0.2381 sec) 

Что мне нужно для моего кода и страницы для корректной работы является чтобы фактически вернуть обратно номер NULL, когда q24 не отвечает на запросы от 1 до 5 - так

login_id hotel_name q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 q16 q17 q18 q19 q20 q21 q22 
66j8ttk2 bbcircus NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 

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

Любая помощь с благодарностью получена !!!

Заранее благодарен,

Гомер.

ответ

0

Просто мысль ... Если вы добавите COUNT (*) для представления totalRecords к вашему запросу. Я думаю, что ВСЕГДА вернет результирующий набор нулевых записей, даже если count = 0. У нас здесь нет MySQL, но он должен работать.

+0

К сожалению, это не сработало DRapp, но спасибо - теперь нашли решение. – 2010-11-29 11:28:38

1

Итак, вы разрешили его, но вы не указали объяснение - вот оно для полноты.

Разница между двумя запрошенными запросами заключается в том, что один LEFT JOINs при определенном условии и других LEFT JOINs, а затем применяет условие к результатам.

Ну, смысл в другом - если вы сначала LEFT JOIN, а затем примените, когда условие, которое применяет условие к столбцу из таблицы в правой части LEFT JOIN, затем обрезает все строки, где отсутствует правая сторона , Это связано с тем, что условие thotels_results.date = 'NOV2010' неверно, если thotels_reults.date IS NULL.

Однако, если условие применяется в LEFT JOIN, то не имеет значения, что это неверно - определение LEFT JOIN - возвращает строку, содержащую NULL для строк, где условие соединения FALSE.

Поэтому разные результирующие множества - из-за того, что условие применяется в другом смысле.

Если вы хотите получить тот же результат с WHERE, вы должны заменить каждое условие, такое как thotels_results.date = 'NOV2010', на thotels_results.date = 'NOV2010' OR thotels_results.date IS NULL - потому что вам не нужны только строки, где поле равно значению, но вы хотите, чтобы строки, где он нулевой.

+0

Спасибо за добавление объяснения. – 2010-12-01 09:28:30