执行查询时,我在 wampserver MySql 5.7.14 中遇到与 sql_mode=only_full_group_by 相关的错误

Posted

技术标签:

【中文标题】执行查询时,我在 wampserver MySql 5.7.14 中遇到与 sql_mode=only_full_group_by 相关的错误【英文标题】:I am getting an error in wampserver MySql 5.7.14 related to sql_mode=only_full_group_by when executing a query 【发布时间】:2017-02-26 12:51:23 【问题描述】:

我已更新我的 wampserver (X64)3.0.6 并使用 php 为我正在开发的 Web 应用程序安装 mysql 5.7.14。在旧版本的 MySql 5.6.17 中运行时,它工作正常。但自从升级到 5.7.14 后,我收到了这个错误:

SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含 非聚合列 'pharmezy-2.p.idproduct' 不是 功能上依赖于 GROUP BY 子句中的列;这是 与 sql_mode=only_full_group_by 不兼容

我的查询是:

    SELECT p.idproduct, p.idproduct, p.product_name, pi.image_url, u.u_company, 
    p.product_rating FROM product p join product_image pi on p.idproduct=pi.idproduct 
    join users u on p.idusers = u.idusers where p.idprocess=1 and p.product_status=1
    group by u.u_company

谢谢

【问题讨论】:

I am getting an error in MySql related to only_full_group_by when executing a query的可能重复 如果您仅按u.u_company 分组,则必须对 select 语句中的所有其他列使用聚合函数。如果您还想按其他列分组,那么您还需要将所有其他列按条件分组。这可能会对您有所帮助:w3schools.com/sql/sql_groupby.asp 这次我使用的是 u.u_company,aggregate_function(u.u_company) 但 FUNCTION pharmezy-2.aggregate_function 不存在 一个聚合函数例如是MAX()MIN()AVG()COUNT()等。提供的链接中有示例。 【参考方案1】:

因为你似乎觉得我写这个答案有问题。

您需要对要聚合的列使用 Aggregate-Functions,例如 MAX()COUNT()。或者你写下你想要分组的所有列。就像你对u.u_company 所做的那样。这也可以通过SELECT DISTINCT 来完成。

例如使用 Aggregate-Function MAX() 并且仅按 u.u_company 分组:

SELECT  MAX(p.idproduct) AS MAX_p_idproduct ,
        MAX(p.product_name) AS MAX_p_product_name ,
        MAX(pi.image_url) AS MAX_pi_image_url ,
        u.u_company ,
        MAX(p.product_rating) AS MAX_p_product_rating
FROM    product p
        JOIN product_image pi ON p.idproduct = pi.idproduct
        JOIN users u ON p.idusers = u.idusers
WHERE   p.idprocess = 1
        AND p.product_status = 1
GROUP BY u.u_company

不使用聚合函数,而是按所有列分组:

SELECT  p.idproduct ,
        p.product_name ,
        pi.image_url ,
        u.u_company ,
        p.product_rating
FROM    product p
        JOIN product_image pi ON p.idproduct = pi.idproduct
        JOIN users u ON p.idusers = u.idusers
WHERE   p.idprocess = 1
        AND p.product_status = 1
GROUP BY u.u_company ,
        p.idproduct ,
        p.product_name ,
        pi.image_url ,
        u.u_company ,
        p.product_rating    

与使用DISTINCT 而不是GROUP BY 的上一个查询相同但不同:

SELECT  DISTINCT p.idproduct ,
        p.product_name ,
        pi.image_url ,
        u.u_company ,
        p.product_rating
FROM    product p
        JOIN product_image pi ON p.idproduct = pi.idproduct
        JOIN users u ON p.idusers = u.idusers
WHERE   p.idprocess = 1
        AND p.product_status = 1

也可以使用聚合函数(与第一个查询相同):

SELECT  DISTINCT MAX(p.idproduct) AS MAX_p_idproduct ,
        MAX(p.product_name) AS MAX_p_product_name ,
        MAX(pi.image_url) AS MAX_pi_image_url ,
        u.u_company ,
        MAX(p.product_rating) AS MAX_p_product_rating
FROM    product p
        JOIN product_image pi ON p.idproduct = pi.idproduct
        JOIN users u ON p.idusers = u.idusers
WHERE   p.idprocess = 1
        AND p.product_status = 1

但在所有情况下,您都需要知道自己要做什么。您只想按u.u_company 分组还是按更多列分组。但无论哪种方式,所有列都参与分组。它们需要通过 Aggregate-Funtion 在组中或由 Aggregate-Funtion 聚合!

【讨论】:

以上是关于执行查询时,我在 wampserver MySql 5.7.14 中遇到与 sql_mode=only_full_group_by 相关的错误的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 用 php 慢

MySQL innoDB:查询执行时间过长

执行查询时hadoop如何处理ram?

MySQL:查询在不同环境中执行的方式不同

相同的查询在重复执行时返回不同的值

在 sequelize 中检查 mysql 连接