MySQL JOIN проблема - PullRequest
       8

MySQL JOIN проблема

0 голосов
/ 29 ноября 2010

РЕШЕНИЕ: Если кому-то интересно:

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 и .brand до того, как предложение WHERE решит проблему.

Утровсе,

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

У меня есть две таблицы в 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, но не могу понять, где я иду не так.

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

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

Гомер.

Ответы [ 2 ]

1 голос
/ 29 ноября 2010

Итак, вы решили это, но не включили объяснение - здесь оно для полноты.

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

Что ж, смысл в другом - если вы сначала LEFT JOIN, а затем примените условие where, которое применяет условие к столбцу из таблицы с правой стороны 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 - потому что вы не хотите только строки, где поле равно значению, но вы хотите, чтобы строки, в которых он равен NULL.

0 голосов
/ 29 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...