You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:21:10