MySQL加入问题

时间:2010-11-29 09:19:23

标签: 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和.brand移至WHERE子句解决问题之前。

早上好,

希望有人能够提供帮助 - 我怀疑我错过了一些完全明显的东西......

我在MySQL hotel_respondentshotel_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;

我遇到的问题如下 - 只要q24中有1,2,3,4,5中的任何一个,代码就会在MySQL中返回正确的结果集。但是,从上面的数据可以看出 - 对于q24,没有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)

我的代码和页面正常工作所需要的是当q24没有1到5的响应时实际带回一系列NULL - 就像这样

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 个答案:

答案 0 :(得分:1)

所以你解决了,但你没有包含解释 - 这里是为了完整性。

提供的两个查询之间的区别在于,一个LEFT JOIN在特定条件下和另一个LEFT JOIN,然后将条件应用于结果。

嗯,意思是不同的 - 如果你首先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,因为您不希望只有字段等于某个值的行但是你想要的行是NULL。

答案 1 :(得分:0)

只是想一想......如果你添加COUNT(*)来代表你的查询的totalRecords。我认为即使count = 0,也应该总是返回零记录的结果集。这里没有MySQL,但是应该有效。