结论:Mysql 使用left join 联表查询时,用主副表都有的字段去order by时,如果不指定字段来源的表,当查询结果中没有这个字段时,sql会报错:ambiguous,字段不明确,而当查询结果中有该字段时,则不会报错,且以查询结果中的那个字段为排序依据。
过程如下:
在开发过程中,偶然发现了一个不解的情况,sql 如下:
SELECT s.id, s.ent_name, s.update_time
FROM t_apply s
LEFT JOIN t_project_info p ON s.project_id = p.id
ORDER BY
update_time DESC;
这里的update_time在 t_apply 表和t_project_info表中都存在,但是sql语句标红的“update_time”不会报错!!
去查相关资料之后才知道原因为查询结果中已指定了字段来源为s.update_time, 所以按s表来排序依据;如果查询结果中没有这个字段,就会报错。
总结:开发过程中,尽量还是都指定一下字段来源,以上SQL没有去指定是因为使用了分页插件PageHelper的缘故,前端传过来的排序字段无法去指定联表中指定的表。这也容易导致在使用这个分页插件的时候,容易出现排序的错误,注意注意!!!!!!