使用CONCAT启用MySQL ONLY_FULL_GROUP_BY

时间:2018-03-23 10:32:42

标签: mysql group-by sql-order-by concat

我在数据库mysql(5.7.21)中有一个表,如下所示:

+----------+--------------+-----------+-----------+
| id_price | id_reference | price_usd | unix_time |
+----------+--------------+-----------+-----------+

我需要提取按年或月(unix_time)分组的平均价格(price_usd)。

我准备了这个查询:

X

内部联接对于获取具有id的产品的名称很有用。

我收到此错误:

  

#1055 - SELECT列表的表达式#1不在GROUP BY子句中   包含非聚合列'name_of_db.price_avg.unix_time',但不是   功能上依赖于GROUP BY子句中的列;这是   与sql_mode = only_full_group_by

不兼容

我无法更改MySQL的设置(我无法禁用ONLY_FULL_GROUP_BY模式或其他任何内容)。

如何在MySQL 5.7.21中更改查询以提取数据?

提前致谢。

3 个答案:

答案 0 :(得分:0)

您可以使用子查询,以便它将是一个完整的组。

Select `date`, 
        AVG(price_usd) AS "model"
From (
   SELECT CONCAT(WEEKOFYEAR(FROM_UNIXTIME(unix_time)),
      '-',
    YEAR(FROM_UNIXTIME(unix_time))) as `date`,
    price_usd
FROM price_avg
INNER JOIN reference ON reference.id_reference=price_avg.id_reference
WHERE price_avg.id_reference=1
) t
GROUP BY `date`
ORDER BY substring(`date`, -4), substring(`date`, 1, 2) ASC;

Result:
date    model
48-1998 11.99
36-2001 19.99

答案 1 :(得分:0)

我用这个查询解决了:

SELECT DATE_FORMAT(FROM_UNIXTIME(unix_time),'%Y-%m') as date, AVG(price_usd) AS model FROM price_avg INNER JOIN reference ON reference.id_reference=price_avg.id_reference WHERE price_avg.id_reference=1 GROUP BY date, price_avg.id_reference ORDER BY date ASC

我有周和年倒置,但我可以在客户环境中解决!

谢谢大家。

答案 2 :(得分:0)

遇到同样的问题,将其报告为MySQL可能存在的错误: https://bugs.mysql.com/bug.php?id=90792&thanks=4

从最初的响应中,它听起来像是一个错误并被修复,但我认为后续建议GROUP BY表达式(而不是列)不是SQL标准的一部分,并且确定复杂表达式是否完全来自GROUPed表达式是困难的,至少现在是他们决定不追求的东西: https://mysqlserverteam.com/when-only_full_group_by-wont-see-the-query-is-deterministic/

在此期间有一些解决方法。