【问题标题】:MySQL ONLY_FULL_GROUP_BY enabled with CONCAT使用 CONCAT 启用 MySQL ONLY_FULL_GROUP_BY
【发布时间】:2018-09-02 00:14:40
【问题描述】:

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

+----------+--------------+-----------+----------- + | id_price | id_reference |价格_美元 | unix_time | +----------+--------------+-----------+----------- +

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

我准备了这个查询:

SELECT CONCAT(WEEKOFYEAR(FROM_UNIXTIME(unix_time)),
  '-',
  YEAR(FROM_UNIXTIME(unix_time))) 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 WEEKOFYEAR(FROM_UNIXTIME(unix_time)), 
  YEAR(FROM_UNIXTIME(unix_time)),
  price_avg.id_reference
ORDER BY unix_time ASC 

内部连接对于获取具有 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 中提取数据?

提前致谢。

【问题讨论】:

  • 我认为您的意思是 group_concat 但由于您不显示任何数据,我们无法确定。
  • 不,我不是说 group_concat。看看anonyXmous的回复

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


【解决方案1】:

遇到同样的问题,将其报告为 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/

目前有一些解决方法。

【讨论】:

  • 我认为这是个好消息。感谢您的留言和@MySQL 的报告 :) 非常感谢!
【解决方案2】:

我用这个查询解决了:

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

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

谢谢大家。

【讨论】:

    【解决方案3】:

    您可以使用子查询,使其成为一个完整的分组依据。

    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
    

    【讨论】:

    • 我试过了,但我得到了同样的错误。 SQL Fiddle 与 MySQL 5.6 一起使用
    • 感谢您的回复,“WHERE”子句应该放在哪里?在子查询里面?
    • 是的,放在子查询里面。我更新了我的答案。
    • 对不起,但它没有按预期工作:查看结果:日期模型 51-2017 19988.0000 52-2017 19980.0000 1-2018 19921.0000 10-2018 21103.0000 11-2018 21004。 -201821110.0000 2-2018 20106.0000 3-2018 20146.0000 4-2018 204251.0000 6-2018 20854.0000 7-2018 20719.0000 8-2018 20719.0000 8-2018 20930.0000 9-2018 20930.0000 9-2018 20874.0000 9-2018 20874.0000 SPAN>
    • 解决了!! :) 我已经发布了答案!
    猜你喜欢
    • 2019-09-04
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多