【问题标题】:Can you use aggregate values within ON DUPLICATE KEY您可以在 ON DUPLICATE KEY 中使用聚合值吗
【发布时间】:2013-07-24 15:02:42
【问题描述】:

我正在尝试编写类似于以下内容的查询:

INSERT INTO SomeTable(field1, field2) 
SELECT 'blah' AS field1, 
        MAX(AnotherTable.number) AS field2
FROM AnotherTable
ON DUPLICATE KEY 
UPDATE field1= 'blah', field2 = MAX(AnotherTable.number)

我收到错误代码:1111 组函数的使用无效。

通读 MySql 文档:

http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

感兴趣的行是:

"在 ON DUPLICATE KEY UPDATE 的值部分中,您可以引用其他表中的列,只要您不在 SELECT 部分中使用 GROUP BY。一个副作用是您必须限定非唯一列值部分中的名称。 "

这是我看到的问题吗?我不是专门在 Select 语句中做 GROUP BY,而是通过使用聚合函数(Max),那么我可能会隐式分组。

如果有人确定我是否在隐式执行 GROUP BY 或者是否有任何其他方式可以获得所需的结果,我将非常感激。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我知道我在这里回答了我自己的问题,但是......

    这最终让它工作了(感谢:a broken link

    INSERT INTO SomeTable(field1, field2) 
    SELECT 'blah' AS field1, 
        MAX(AnotherTable.number) AS field2
    FROM AnotherTable
    ON DUPLICATE KEY 
    UPDATE field2 = values(field2)
    

    【讨论】:

    • 啊,当然是价值观。忘了那个。来自我的 +1 :)
    • 请注意,您应该将内容插入到 values() 函数中的是表的列名,而不是聚合字段的名称。 @ user1491016 可能值得将您的 MAX() 字段重命名为 max_field2 以使其更清晰。无论哪种方式,您都向我发送了正确的方向,感谢您的解决方案:)
    • 这在 MySQL 8.xx 中是如何工作的?我收到警告 1287 "'VALUES function' 已弃用,将在未来版本中删除。请使用别名 (INSERT INTO ... VALUES (...) AS alias) 并替换 ON DUPLICATE 中的 VALUES(col) KEY UPDATE 子句用 alias.col 代替”。但是在这种语句中,我们有一个子查询......
    【解决方案2】:

    如果可行,请试一试:

    INSERT INTO SomeTable(field1, field2) 
    SELECT * FROM (
    SELECT * FROM (
    SELECT 'blah' AS field1, 
            MAX(AnotherTable.number) AS field2
    FROM AnotherTable
    ) sq
    ) sq2
    ON DUPLICATE KEY 
    UPDATE field1= 'blah', field2 = sq2.field2
    

    不确定是否需要 2 次子查询。我通常使用它来规避 MySQL 的限制,即无法使用从同一个表中读取的值更新表。不确定这是否也适用于此。

    【讨论】:

    • 遗憾的是,这也不起作用。它不识别AnotherTable.field2。我确实尝试为 select 设置别名,但 MySql 也很适合。
    • 编辑了我的答案,请再试一次。
    • 谢谢fancyPants。在搜索谷歌后,我遇到了这个:getrouty.com/…,如果我添加值,它似乎可以工作。我将在下面添加 SQL。
    猜你喜欢
    • 2018-07-12
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    相关资源
    最近更新 更多