2015-04-24 42 views
0

我有一个GREATEST()和LEFT JOIN语句的问题,看起来像它与不同版本的MySQL有关。我有一张储存school_id和school_type的表格。有4种学校类型,每种学校类型都有独立的桌子。我有一个查询,将根据学校类型从单独的表格中提取所有学校名称。因此,我们有如下表:MySQL - 使用GREATEST()和LEFT JOIN返回NULL的问题

tbl_report(学生证的商店列表和类型) tbl_grad_school tbl_lang_school tbl_high_school

MySQL的声明将拉动学校相对于学校的类型名称(,再加上从tbl_report其他一些细节因此,这里是我:

SELECT 
GREATEST(s1.school_name, s2.school_name, s3.school_name) as `school`, 
tbl_report.school_id, 
tbl_report.school_type, 
tbl_report.date, 

FROM tbl_report 

LEFT JOIN tbl_grad_school AS s1 ON tbl_report.school_id=s1.id AND tbl_report.school_type=1 
LEFT JOIN tbl_lang_school AS s2 ON tbl_report.school_id=s2.id AND tbl_report.school_type=2 
LEFT JOIN tbl_high_school AS s3 ON tbl_report.school_id=s3.id AND tbl_report.school_type=3 

所讨论的问题是

GREATEST(s1.school_name, s2.school_name, s3.school_name) as `school` 

当使用MySQL版本4.x这工作正常,它正确抓取名称,只选择非空列。但是当使用MySQL 5.x时,总是显示NULL。如果我做一个SELECT,分别拉出s1.school_name,s2.school_name等,我可以看到非NULL列很好,但使用GREATEST不起作用。

任何想法发生了什么?这是我在整个程序中经常使用的MySQL代码中非常重要的一部分。

回答

5

greatest()在这里看起来很奇怪。在任何情况下,从版本5.0左右开始,如果的任何的值为NULL,则返回NULL

也许这是你真正想要的:

SELECT COALESCE(s1.school_name, s2.school_name, s3.school_name) as `school`, 

这将返回第一个非NULL值。