【问题标题】:#1055 - Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column#1055 - SELECT 列表的表达式 #6 不在 GROUP BY 子句中,并且包含非聚合列
【发布时间】:2017-07-29 12:02:51
【问题描述】:

我在 MySQL 5.7 中对下面的查询有疑问,但在 MySQL 5.6 中它运行良好。

此消息每次都会出现:

1055 - SELECT 列表的表达式 #6 不在 GROUP BY 子句中,并且包含非聚合列
“electricity_databases.electricity_invoices.date_inserted”在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容

SQL 代码:

SELECT 
homes.id,
homes.homeName,
homes.city, 
homes.date_registered,
ROUND(SUM(electricity_invoices.total), 2) AS TotalPrice,
DATEDIFF(NOW(), electricity_invoices.date_inserted) AS last_insert_in_days,
MAX(electricity_invoices.date_inserted) AS last_insert,
COUNT(electricity_invoices.homeID) AS countPaymentTimes,
MAX(electricity_invoices.currRead) AS currRead,
MAX(electricity_invoices.prevRead) AS prevRead,
ROUND(MAX(electricity_invoices.currRead) - MAX(electricity_invoices.prevRead), 1) AS lastComp,
customer.name

FROM homes

LEFT JOIN electricity_invoices ON
homes.id = electricity_invoices.homeID

LEFT JOIN customer ON
homes.id = customer.homeID

GROUP BY homes.id
ORDER BY homes.id

【问题讨论】:

    标签: mysql mysql-error-1055


    【解决方案1】:

    原因是在最新版本的 MySQL 中,默认情况下不允许在 group by 子句中添加非聚合列。您可以通过禁用 sql_mode from full group by 模式来禁用此行为。

    只需在group by 子句中添加非聚合列即可。

    select homes.id,
        homes.homeName,
        homes.city,
        homes.date_registered,
        ROUND(SUM(electricity_invoices.total), 2) as TotalPrice,
        DATEDIFF(NOW(), electricity_invoices.date_inserted) as last_insert_in_days,
        MAX(electricity_invoices.date_inserted) as last_insert,
        COUNT(electricity_invoices.homeID) as countPaymentTimes,
        MAX(electricity_invoices.currRead) as currRead,
        MAX(electricity_invoices.prevRead) as prevRead,
        ROUND(MAX(electricity_invoices.currRead) - MAX(electricity_invoices.prevRead), 1) as lastComp,
        customer.name
    from homes
    left join electricity_invoices on homes.id = electricity_invoices.homeID
    left join customer on homes.id = customer.homeID
    group by homes.id,
        homes.homeName,
        homes.city,
        homes.date_registered,
        customer.name
    

    【讨论】:

    【解决方案2】:

    从 mysql 5.7 开始,您可以选择组中不存在的非聚合列 如果您想要与以前版本相同的行为,您必须撤销 sql_mode=only_full_group_by (使用 SET sql_mode = '') 或更恰当地说,您应该建立一个选择或评估以按所有未聚合的列进行分组 例如:

    SELECT 
    homes.id,
    homes.homeName,
    homes.city, 
    homes.date_registered,
    ROUND(SUM(electricity_invoices.total), 2) AS TotalPrice,
    DATEDIFF(NOW(), electricity_invoices.date_inserted) AS last_insert_in_days,
    MAX(electricity_invoices.date_inserted) AS last_insert,
    COUNT(electricity_invoices.homeID) AS countPaymentTimes,
    MAX(electricity_invoices.currRead) AS currRead,
    MAX(electricity_invoices.prevRead) AS prevRead,
    ROUND(MAX(electricity_invoices.currRead) - MAX(electricity_invoices.prevRead), 1) AS lastComp,
    customer.name
    
    FROM homes
    
    LEFT JOIN electricity_invoices ON
    homes.id = electricity_invoices.homeID
    
    LEFT JOIN customer ON
    homes.id = customer.homeID
    
    GROUP BY homes.id, homes.homeName,homes.city, homes.date_registered, DATEDIFF(NOW(), electricity_invoices.date_inserted) AS last_insert_in_days
    ORDER BY homes.id
    

    或者,由于您不需要这些列的特定值,因此对这些列使用(假)聚合

    SELECT 
    homes.id,
    min(homes.homeName),
    min(homes.city), 
    min(homes.date_registered),
    ROUND(SUM(electricity_invoices.total), 2) AS TotalPrice,
    min(DATEDIFF(NOW(), electricity_invoices.date_inserted) AS last_insert_in_days),
    MAX(electricity_invoices.date_inserted) AS last_insert,
    COUNT(electricity_invoices.homeID) AS countPaymentTimes,
    MAX(electricity_invoices.currRead) AS currRead,
    MAX(electricity_invoices.prevRead) AS prevRead,
    ROUND(MAX(electricity_invoices.currRead) - MAX(electricity_invoices.prevRead), 1) AS lastComp,
    customer.name
    
    FROM homes
    
    LEFT JOIN electricity_invoices ON
    homes.id = electricity_invoices.homeID
    
    LEFT JOIN customer ON
    homes.id = customer.homeID
    
    GROUP BY homes.id
    ORDER BY homes.id
    

    【讨论】:

    • 如何禁用sql_mode,如果我禁用它会损坏数据库
    • 不..您不会损坏数据库...只有您使用与以前版本相同的(旧的和不可预测的)模式..但是使用旧模式您使用 group by 是错误的方式..
    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2016-04-27
    • 1970-01-01
    • 2018-06-12
    • 2021-11-13
    • 2016-07-13
    相关资源
    最近更新 更多