我在数据库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中更改查询以提取数据?
提前致谢。
答案 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/
在此期间有一些解决方法。