【问题标题】:Selecting a minimum sum of columns for a group为组选择最小的列总和
【发布时间】:2016-03-29 01:29:51
【问题描述】:

我很难找到解决这个问题的简单方法。

你可以假设UNIQUE KEY (A, B, C, D, E)

我正在尝试SELECT 上表中的所有行,这样对于每个唯一的C, D, E 组,我想要A, B,这样A + B <= 的所有其他A + B 组合对于特定的@ 组987654331@.

因此,对上述数据执行SELECT 应该会产生(在平局的情况下,选择第一个):

如果我是GROUP BY C, D, E,那么A, B 列是任意选择的(技术上首先A, B 是数据库内部遇到的)。

如果这是关系代数,我会将关系与其自身交叉连接,选择“两个”关系中C, D, E 相等的位置以及关系副本中A + B 的位置大于另一个副本的A + B,然后从原始关系中减去结果。

我认为,在MySQL 中有一种更简单的方法来执行此操作。该表可能有数千组C, D, E,每组包含5到10个A, B。我不相信CROSS JOIN 会非常有效。

【问题讨论】:

    标签: mysql sql database select database-design


    【解决方案1】:

    这样做的一种方法是为cde 的每个组合选择最小值,然后将其与表上的查询连接:

    SELECT mytable.*
    FROM   mytable t
    JOIN   (SELECT   c, d, e, MIN(a + b) AS min_ab
            FROM     mytable
            GROUP BY c, d, e) s ON t.c = s.c AND
                                   t.d = s.d AND
                                   t.e = s.e AND
                                   t.a + t.b = s.min_ab
    

    【讨论】:

    • 即使它不是标准 SQL,OP 也可能希望在外部查询中使用 GROUP BY c, d, e 以消除联系。然而,值得注意的是,对于这种表结构,想要的“在平局的情况下,选择第一个”的决定是不可能的(从迂腐的角度来说),因为表没有固有的“第一”行;未定义未包含在 GROUP BY 中的 a 和 b 值来自的行......虽然我会打赌,但理论上它们甚至有可能来自不同的行。
    • @Uueerdo 如果有ORDER BY,就会有“第一个”,对吧?无论哪种方式,我提到“选择第一个”的唯一原因是消除歧义并确保一致性。否则,只要这些值的总和是最小值,数据就可以发挥作用。
    • @noahnu 因为ORDER BYGROUP BY 之后,我怀疑这是否会有所帮助。也许如果上面的mytable t 被转换成(SELECT * FROM mytable ORDER BY c, d, e, a, b) AS t 这样的东西,你可以提供一些一致性。根据您使用它的目的,我不会太担心;只要在此查询的执行之间没有发生大量 DELETE 和 INSERT 语句,我通常希望结果每分钟都保持一致。
    猜你喜欢
    • 1970-01-01
    • 2021-01-29
    • 2015-10-15
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    相关资源
    最近更新 更多