mysql中按年、月分组时出错

mysql中按年、月分组时出错,mysql,group-by,Mysql,Group By,我有此代码,它在联机服务器上正常工作: SELECT DATE(`order`.`date`) AS `dater`, COUNT(*) AS `orders-amount`, SUM(`order`.`price`) AS `orders-income`, (SELECT SUM(`amount`) FROM `paypal` WHERE `paypal`.`txn_id` != 'Bonus' AND YEAR(`dater`) = YEAR(`paypal`.`posted_date`)

我有此代码,它在联机服务器上正常工作:

SELECT
DATE(`order`.`date`) AS `dater`,
COUNT(*) AS `orders-amount`,
SUM(`order`.`price`) AS `orders-income`,
(SELECT SUM(`amount`) FROM `paypal` WHERE `paypal`.`txn_id` != 'Bonus' AND YEAR(`dater`) = YEAR(`paypal`.`posted_date`) AND MONTH(`dater`) = MONTH(`paypal`.`posted_date`)) AS `total_charge`
FROM `order`
GROUP BY YEAR(`dater`), MONTH(`dater`)
ORDER BY `dater` DESC
但在localhost上,它会出现如下错误:

#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'panel.order.date' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Id我使用此代码进行分组,然后它正常工作:

GROUP BY `dater`

当我在linux Mint上运行并安装apache、php、mysql和pypmyadmin时,此错误仅出现在localhost上。您的错误消息中有此错误:

这与sql\u mode=only\u full\u group\u by不兼容

如果您不是故意设置的,我猜您是在默认情况下得到它的,并且您的本地服务器上有一个不同的版本(请参阅,它在某个时候被设置为默认版本)


因此,您只需通过运行
setsql\u mode=''来禁用此模式,或按照以下说明将其显示在错误消息中:

这与sql\u mode=only\u full\u group\u by不兼容

如果您不是故意设置的,我猜您是在默认情况下得到它的,并且您的本地服务器上有一个不同的版本(请参阅,它在某个时候被设置为默认版本)


因此,您只需通过运行
setsql\u mode=''来禁用此模式,或者按照说明操作,这意味着在本地和远程服务器上使用不同的sql模式。
您应该更改模式或更新查询,如下所示:

SELECT
YEAR(ANY_VALUE(`order`.`date`)) date_year,
MONTH(ANY_VALUE(`order`.`date`)) date_month,
COUNT(*) AS `orders-amount`,
SUM(`order`.`price`) AS `orders-income`,
(SELECT SUM(`amount`) FROM `paypal` WHERE `paypal`.`txn_id` != 'Bonus' AND YEAR(ANY_VALUE(`order`.`date`)) = YEAR(`paypal`.`posted_date`) AND MONTH(ANY_VALUE(`order`.`date`)) = MONTH(`paypal`.`posted_date`)) AS `total_charge`
FROM `order`
GROUP BY date_year, date_month

这意味着在本地和远程服务器上使用不同的sql模式。 您应该更改模式或更新查询,如下所示:

SELECT
YEAR(ANY_VALUE(`order`.`date`)) date_year,
MONTH(ANY_VALUE(`order`.`date`)) date_month,
COUNT(*) AS `orders-amount`,
SUM(`order`.`price`) AS `orders-income`,
(SELECT SUM(`amount`) FROM `paypal` WHERE `paypal`.`txn_id` != 'Bonus' AND YEAR(ANY_VALUE(`order`.`date`)) = YEAR(`paypal`.`posted_date`) AND MONTH(ANY_VALUE(`order`.`date`)) = MONTH(`paypal`.`posted_date`)) AS `total_charge`
FROM `order`
GROUP BY date_year, date_month

有点不对劲——如果它在生产中工作,那是因为它返回了一个任意的年份和月份的日期。一般来说,如果要按年份和月份分组,则应选择这些字段而不是日期。如果您想按日期分组,那么您的第二个示例是正确的。如果没有示例数据和预期结果,这有点难说。MySQL 5.7默认情况下只强制执行
,这使得MySQL的行为更像标准SQL,并且几乎像所有其他RDBMS实现一样。您可以更改您的
sql\u模式
,或者您可以编写查询以符合所需的语义。@sgedes谢谢您的回复,我做了一些类似的事情,但它也不起作用,我尝试了很多次,但我无法理解这个错误,以及为什么它在服务器上没有错误地工作,只是想知道您的本地主机启用了
仅\u full\u group\u by
,可能是因为它是MySQL的较新版本。您必须通过
总费用
添加到
分组中,但这样做可能会更改查询结果。这是MySQL开发人员多年来犯的一个错误,因为它在早期版本中表现得比较宽松。有些不太对劲——如果它在生产环境中工作,那是因为它返回了任意的年份和月份日期。一般来说,如果要按年份和月份分组,则应选择这些字段而不是日期。如果您想按日期分组,那么您的第二个示例是正确的。如果没有示例数据和预期结果,这有点难说。MySQL 5.7默认情况下只强制执行
的,这使得MySQL的行为更像标准SQL,并且几乎像所有其他RDBMS实现一样。您可以更改您的
sql\u模式
,或者您可以编写查询以符合所需的语义。@sgedes谢谢您的回复,我做了一些类似的事情,但它也不起作用,我尝试了很多次,但我无法理解这个错误,以及为什么它在服务器上没有错误地工作,只是想知道您的本地主机启用了
仅\u full\u group\u by
,可能是因为它是MySQL的较新版本。您必须通过将
总费用
添加到
分组中,但这样做可能会更改查询结果。这是MySQL开发人员多年来犯的一个错误,因为它在早期版本中表现得很宽容。非常感谢,我按照您发送的链接中的说明更改了模式,现在它工作正常:)非常感谢,我按照您发送的链接中的说明操作并更改模式,现在它工作正常:)