MySQL 5.7报错‘Duplicate column name 'M'’,求排查原因
问题原因与解决方法
错误根源在于中间子查询的SELECT *语句:当t1和t2进行左连接后,两张表都包含M和Y列,使用SELECT *会将这两个重复列都保留在临时结果集中,导致MySQL无法识别唯一的列名,从而触发"Duplicate column name 'M'"错误。
解决方法是避免使用SELECT *,而是明确指定需要的列,只保留t1的M、Y、Дней в месяце,以及t2的Занято дней、Доход、Процент занятости列,这样就不会出现重复列名的问题。
修正后的SQL语句如下:
SELECT `t1`.`M`, `t1`.`Y`, COALESCE(`t2`.`Занято дней`, 0), `t1`.`Дней в месяце`, COALESCE(`t2`.`Доход`, 0), COALESCE(`t2`.`Процент занятости`, 0) FROM ( -- 替换SELECT *为明确指定的列 SELECT `t1`.`M`, `t1`.`Y`, `t1`.`Дней в месяце`, `t2`.`Занято дней`, `t2`.`Доход`, `t2`.`Процент занятости` FROM ( SELECT DISTINCT MONTH(`CAL`.`D`) AS `M`, YEAR(`CAL`.`D`) AS `Y`, DAYOFMONTH(LAST_DAY(CONCAT(YEAR(`CAL`.`D`), '-', LPAD(MONTH(`CAL`.`D`),2,'00'), '-01'))) AS `Дней в месяце` FROM `CAL` ) AS `t1` LEFT JOIN (SELECT `M`,`Y`,`Занято дней`, `Доход`, `Процент занятости` FROM `Статистика по месяцам`) AS `t2` ON (`t1`.`M` = `t2`.`M` AND `t1`.`Y` = `t2`.`Y`) WHERE STR_TO_DATE(CONCAT(`t1`.`Y`, '-', `t1`.`M`, '-01'), '%Y-%m-%d') BETWEEN (select min(STR_TO_DATE(CONCAT(`Y`, '-', `M`, '-01'), '%Y-%m-%d')) FROM `Статистика по месяцам`) AND Date(NOW()) ) AS `tbl`
额外说明:原查询中min(STR_TO_DATE(CONCAT(t1.Y, '-', t1.M, '-01'), '%Y-%m-%d'))无需引用t1,因为内层子查询是从Статистика по месяцам取数据,直接使用表本身的Y和M即可,修正后避免了不必要的关联。
内容的提问来源于stack exchange,提问作者Artem
相关产品推荐
相关产品推荐

