2017-04-07 48 views
0

我是mysql新手。我有一个要求,请参阅下面在mysql中获取2个不同表的结果

grand_score_master 

autoid | user_id | package_id | grand_level | timestamp | timestring 
55  | CBS_00002 | s78c_e4vt6 | 1   | ...  | ... 
58  | CBS_00002 | d47kndffqc | 3   | ...  | ... 
64  | CBS_00002 | d47kndffqc | 1   | ...  | ... 
65  | CBS_00002 | d47kndffqc | 2   | ...  | ... 


mega_score_master 

autoid | user_id | package_id | mega_level | timestamp | timestring 
1  | CBS_00002 | d47kndffqc | 1   | ...  | ... 


expected result 

user_id | package_id | max_grand_leve | max_mega_level 
CBS_00002 | s78c_e4vt6 | 1    | 0 
CBS_00002 | d47kndffqc | 3    | 1 

package_iduser_id是表都是表所示。

我试图做一个查询,我将通过为user_id说“CBS_00002”和查询将通过匹配/从表都为用户分组的共同的package_id返回max(grand_level)max(mega_level)

我想这

SELECT max(grand_score_master.grand_level), 
     grand_score_master.package_id, 
     max(mega_score_master.mega_level) 
FROM grand_score_master 
INNER JOIN mega_score_master 
ON  mega_score_master.package_id = grand_score_master.package_id 
WHERE user_id='CBS_00002' 
GROUP BY grand_score_master.package_id 

但它仅适用于d47kndffqc返回结果因为s78c_e4vt6没有出现在mega_score_master

需要一些帮助。

+1

链接图像是不好的做法,因为如果链接被打破,这个问题对未来的读者是没有用的。改为发布样本数据和预期输出以及格式化文本。 –

回答

1

你快到了,你只需要将你的inner join更改为left join;这会保留所有行从第一个表,无论在第二个或不匹配:

SELECT max(t1.grand_level) max_grand_level, 
     t1.package_id, 
     IFNULL(max(t2.mega_level), 0) max_mega_level 
FROM grand_score_master t1 
LEFT JOIN 
     mega_score_master t2 
ON  t2.package_id = t1.package_id 
WHERE t1.user_id='CBS_00002' 
GROUP BY t1.package_id 

我还添加别名到表中,以便查询结果更紧凑一点。

+0

亲爱的它的工作原理,但有没有什么办法可以将NULL转换为0在这个查询 – raju

+1

好吧,我得到了IFNULL(列,0) – raju