【问题标题】:SQL update after choosing a MAX from some AVERAGEs从某些 AVERAGE 中选择 MAX 后 SQL 更新
【发布时间】:2014-01-29 20:29:54
【问题描述】:

我有 2 个具有相同列但数据不同的表。我需要计算一个表中一列的平均值(带有一些过滤器)并选择它们的最大值。然后将该值放入第二个表中。 到目前为止,我已经构建了这个查询:

UPDATE st16 
    INNER JOIN st17 ON st17.parent = st16.uid 
    SET 
        st16.p1 = SELECT MAX(
            (SELECT AVG(st17.p1) FROM st17 WHERE st17.parent = st16.uid AND st17.row = st16.row)), 
        st16.p2 = SELECT MAX(
            (SELECT AVG(st17.p2) FROM st17 WHERE st17.parent = st16.uid AND st17.row = st16.row))

但我收到此错误:“#1111 - 无效使用组函数”。 有任何想法吗?谢谢!

示例数据(首先是st17,下面是st16):

+----------------------------------+----------------------------------+----------------------------------------------------------------------------------------------------------------+---------------------+---------------------+-----+
| uid                              | parent                           | fen                                                                                                            | p1                  | p2                  | row |
+----------------------------------+----------------------------------+----------------------------------------------------------------------------------------------------------------+---------------------+---------------------+-----+
| ee95b564f2b3fa1573b451d8f4e00f5d | bc5ef0d66b3bde08b0ba35a91412c058 | QS7D8D/4H9HQH4D4S/6H8HTHJHKH/4CAS/9S9D7CJC9C/6C8CQCKCAC/6D5D3D2DKSJSTS8S7S6S5S3S2SAH7H5H3H2HTC5C3C2CADKDQDJDTD | -10.481481481481481 |  10.481481481481481 |   1 |
| 691ed545dd5375cb3e75f0b8d032534b | bc5ef0d66b3bde08b0ba35a91412c058 | QS7D6D/4H9HQH4D4S/6H8HTHJHKH/4CAS/9S9D7CJC9C/6C8CQCKCAC/5D3D2DKSJSTS8S7S6S5S3S2SAH7H5H3H2HTC5C3C2CADKDQDJDTD8D | -10.481481481481481 |  10.481481481481481 |   1 |
| b6e2a3f4ea51c8e6638a2cc657bf3511 | bc5ef0d66b3bde08b0ba35a91412c058 | QS7D5D/4H9HQH4D4S/6H8HTHJHKH/4CAS/9S9D7CJC9C/6C8CQCKCAC/3D2DKSJSTS8S7S6S5S3S2SAH7H5H3H2HTC5C3C2CADKDQDJDTD8D6D | -10.481481481481481 |  10.481481481481481 |   1 |
| 0dbe5038d01e457e4f65415ac081d0dd | bc5ef0d66b3bde08b0ba35a91412c058 | QS7D3D/4H9HQH4D4S/6H8HTHJHKH/4CAS/9S9D7CJC9C/6C8CQCKCAC/2DKSJSTS8S7S6S5S3S2SAH7H5H3H2HTC5C3C2CADKDQDJDTD8D6D5D | -10.481481481481481 |  10.481481481481481 |   1 |
| ca1e85058ed8294d60a9922d36f8c1fa | bc5ef0d66b3bde08b0ba35a91412c058 | QS7D2D/4H9HQH4D4S/6H8HTHJHKH/4CAS/9S9D7CJC9C/6C8CQCKCAC/KSJSTS8S7S6S5S3S2SAH7H5H3H2HTC5C3C2CADKDQDJDTD8D6D5D3D | -10.481481481481481 |  10.481481481481481 |   1 |
| e85179f395ba8e441ff7b1544e05404c | c75eb9315dee4e3b42fb52e8cd509910 | QS7DJS/4H9HQH4D4S/6H8HTHJHKH/4CKS/9S9D7CJC9C/6C8CQCKCAC/TS8S7S6S5S3S2SAH7H5H3H2HTC5C3C2CADKDQDJDTD8D6D5D3D2DAS |  -9.703703703703704 |   9.703703703703704 |   1 |
| eb3c352febe8ff25f375032bbb6cc5d7 | c75eb9315dee4e3b42fb52e8cd509910 | QS7DTS/4H9HQH4D4S/6H8HTHJHKH/4CKS/9S9D7CJC9C/6C8CQCKCAC/8S7S6S5S3S2SAH7H5H3H2HTC5C3C2CADKDQDJDTD8D6D5D3D2DASJS |  -9.703703703703704 |   9.703703703703704 |   1 |
| 69f06801edf9b3cf669df56dc9152271 | c75eb9315dee4e3b42fb52e8cd509910 | QS7D8S/4H9HQH4D4S/6H8HTHJHKH/4CKS/9S9D7CJC9C/6C8CQCKCAC/7S6S5S3S2SAH7H5H3H2HTC5C3C2CADKDQDJDTD8D6D5D3D2DASJSTS |  -9.703703703703704 |   9.703703703703704 |   1 |
| 5f78082dd3aee8b51bf096286df5e4e7 | c75eb9315dee4e3b42fb52e8cd509910 | QS7D5H/4H9HQH4D4S/6H8HTHJHKH/4CKS/9S9D7CJC9C/6C8CQCKCAC/3H2HTC5C3C2CADKDQDJDTD8D6D5D3D2DASJSTS8S7S6S5S3S2SAH7H |  -9.703703703703704 |   9.703703703703704 |   1 |
| 7ee50e8aa1afd3af703b3a5b3cdf3cf8 | c75eb9315dee4e3b42fb52e8cd509910 | QS7D3H/4H9HQH4D4S/6H8HTHJHKH/4CKS/9S9D7CJC9C/6C8CQCKCAC/2HTC5C3C2CADKDQDJDTD8D6D5D3D2DASJSTS8S7S6S5S3S2SAH7H5H |  -9.703703703703704 |   9.703703703703704 |   1 |
+----------------------------------+----------------------------------+----------------------------------------------------------------------------------------------------------------+---------------------+---------------------+-----+

+----------------------------------+----------------------------------+----------------------------------------------------------------------------------------------------------------+----+----+-----+
| uid                              | parent                           | fen                                                                                                            | p1 | p2 | row |
+----------------------------------+----------------------------------+----------------------------------------------------------------------------------------------------------------+----+----+-----+
| bc5ef0d66b3bde08b0ba35a91412c058 | 9e123e356e468b847d4493cf55809fcd | QS7D/4H9HQH4D4S/6H8HTHJHKH/4CAS/9S9D7CJC9C/6C8CQCKCAC/KSJSTS8S7S6S5S3S2SAH7H5H3H2HTC5C3C2CADKDQDJDTD8D6D5D3D2D |  0 |  0 |   1 |
+----------------------------------+----------------------------------+----------------------------------------------------------------------------------------------------------------+----+----+-----+

【问题讨论】:

  • 您不能将子查询用作聚合函数的参数。你能提供一些样本数据和期望的结果吗?目前尚不清楚(至少对我而言)您要做什么。
  • 所以,我在这里放了一些我的数据表的摘录:dl.dropboxusercontent.com/u/102498471/sql.jpg 在那里可见,以黄色突出显示的是我需要处理的部分数据样本:在表 st17 中,我需要计算highleted 行的平均值(它们有 row = 1 )。可能还有其他 1 或 2 个这样的集合,但 row = 2 和 row = 3。我也需要对它们进行平均。然后我需要选择 3 个平均值的 MAX 并更新表 st16.p1 中的 uid 以该 MAX 值突出显示的行。
  • @xybox 。 . .您应该将数据和期望的结果放在问题中。首先,您拥有的图片无法阅读。其次,链接随时可能失效。
  • 我不明白为什么您认为该图像不可读(显然您需要以 100% 缩放查看它),或者它可能会过期,因为它是在一个保管箱上。但是,我还不能将图像发布到问题的正文中(需要 10 个声望点,而且我是新注册的)。无论如何...感谢您的帮助。
  • @xybox 。 . .将问题中的数据作为文本而不是图像。

标签: mysql sql sql-update max average


【解决方案1】:

正如 Gordon Linoff 所提到的,您不能将子查询传递给聚合函数,例如 MAX()。您可能会遇到的另一个问题是:您无法从 MySQL 中更新的表中进行选择。所以像这样的

UPDATE st16 
SET 
    st16.p1 = (SELECT AVG(st17.p1) FROM st17 JOIN st16 ON st17.parent = st16.uid WHERE st17.row = st16.row ORDER BY AVG(st17.p1) DESC LIMIT 1), 
    st16.p2 = (SELECT AVG(st17.p2) FROM st17 JOIN st16 ON st17.parent = st16.uid WHERE st17.row = st16.row ORDER BY AVG(st17.p2) DESC LIMIT 1);

工作,很遗憾。您可能只想将其分解为多个查询;也就是说,首先在SELECT 中检索最大平均值,然后在第二个单独的UPDATE 中发送这些结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多