【问题标题】:MySQL - combining two records, different fields from each recordMySQL - 组合两条记录,每条记录的不同字段
【发布时间】:2013-04-08 02:04:05
【问题描述】:

我正在更新现有数据库以简化它并扩展其功能。我有一张如下表:

ID  Parent  increment     info 1    info 2
1   103        0            25        1
2   103        1             4        2
3   103        2            45        5
4   103        3            13        7
5   115        0            17        5
6   115        1            23        3
7   116        0            22        2
8   116        1            1         1
9   116        2            7         3
10  117        0            19        4

我希望新表只包含每个“父”的一条记录,并且该记录应包含大多数字段,来自具有最大“增量”数的父编号的记录中的数据,但对于信息 2它应该包含来自具有最小“增量”的记录的数据。

想要的输出如下:

ID  Parent  increment   info 1  info 2
4   103        3        13         1
6   115        1        23         5
9   116        2        7          2
10  117        0        19         4

这种选择性合并记录在 Mysql 中可行吗?

我已经研究过使用 Group by Parent,但有相当多的字段需要引入,所以我不确定这是否可行。我还查看了表的 LEFT OUTER JOIN 以突出显示每个父级中具有最大增量的记录,但这不允许我从具有相同父级但最小增量的记录中选择数据。

很难过,非常感谢有人的帮助。

【问题讨论】:

    标签: mysql merge selection records


    【解决方案1】:
    SELECT tt1.ID, tt1.Parent, MaxInc, tt1.info1, tt2.info2 FROM 
    (SELECT ID, Parent, MaxInc, info1 FROM test INNER JOIN 
    (SELECT Parent AS p, MAX(incr) AS MaxInc FROM test GROUP BY Parent) AS t1 
    ON Parent = p AND incr = MaxInc) AS tt1 INNER JOIN
    (SELECT Parent, info2 FROM test INNER JOIN 
    (SELECT Parent AS p, MIN(incr) AS MinInc FROM test GROUP BY Parent) AS t2 
    ON Parent = p AND incr = MinInc) AS tt2 ON tt1.Parent = tt2.Parent
    

    我将增量更改为 incr

    【讨论】:

    • 太棒了。像梦一样工作。我是这里的新手,但会投票赞成这个答案,w770115,否则。
    • 我也在尝试将相同的查询应用于 ms-access mdf 文件,但不断出现连接错误。有什么想法吗?
    • 在 MS Access 中,子查询必须在不同的查询中完成,然后您可以内部连接到该查询。这里:
    • 在 MS Access 中,子查询必须在不同的查询中完成,然后您可以内部连接到该查询。这里:这将是第一个查询: SELECT Parent AS p, MAX(incr) AS MaxInc FROM test GROUP BY Parent 保存例如 query1 第二个查询 - query2: SELECT Parent AS p, MIN(incr) AS MinInc FROM test GROUP BY Parent
    • 第三个 - query3: SELECT ID, Parent, MaxInc, info1 FROM test INNER JOIN query1 AS t1 ON Parent = p AND incr = MaxInc 第四个 - query4: SELECT Parent, info2 FROM test INNER JOIN query2 AS t2 ON Parent = p AND incr = MinInc 最后一个:SELECT tt1.ID, tt1.Parent, MaxInc, tt1.info1, tt2.info2 FROM query3 AS tt1 INNER JOIN query4 AS tt2 ON tt1.Parent = tt2.Parent
    【解决方案2】:

    是的,您可以这样做。假设您在附加字段中只有 1 到 9 的值:

    select t.*
    from t join
         (select left(parent, locate(' ', parent) - 1) as p,
                 MAX(parent) as maxparent,
                 max(len
          from t
          group by left(parent, locate(' ', parent))
         ) tp
         on left(t.parent, locate(' ', t.parent) - 1) = tp.p
    where t.parent = tp.maxparent
    

    如果数字超过9,则需要一些额外的摆弄,例如:

    select *
    from t join
         (select left(parent, locate(' ', parent) - 1) as p,
                 max(SUBSTRING(parent, locate(' ', parent) + 1)) as maxval
          from t
          group by left(parent, locate(' ', parent))
         ) tp
         on left(t.parent, locate(' ', t.parent) - 1) = tp.p
    where t.parent = concate(tp.p, ' ', maxval)
    

    修改后的数据结构:

    select t.*
    from t join
         (select parent, MAX(increment) as maxi
          from t
          group by parent
         ) tp
         on t.parent = tp.parent and t.increment = tp.maxi
    

    【讨论】:

    • 感谢您的快速响应。我会试一试并报告。
    • locate(' ', parent) -1) 语言是必需的吗?我的表格布局不是很清楚。我整理了一下。
    • @TimCullen 。 ..不,这大大简化了问题。查看最终答案。
    • 感谢您的 cmets。这成功地为每个“父”选择了具有最高增量的记录。但我想将该记录中的一些字段与该记录中的一些字段与该“父级”的最小增量相结合
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2021-09-23
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多