【问题标题】:How to merge rows in mysql based on an operation between columns如何根据列之间的操作合并mysql中的行
【发布时间】:2012-04-10 08:40:47
【问题描述】:

我有下表

tbl
|city| district| start_num| end_num|
|a     |b        |10       |19|
|a     |b        |20       |29|
|a     |b        |30       |33|
|c     |d        |34       |40
|c     |d        |41       |59|
|c     |d        |70      |100|

我想有另一个表,我已经合并了行,考虑到: 相同的城市和地区以及范围开始结束MUSS是连续的。

tbl_res should be 
|city |district |start_num |end_num|
|a     |b        |10        |33|
|c     |d        |34        |59|
|c     |d        |70       |100|

这个想法是消除与另一行的范围是连续的行,以具有更大连续范围的一行结束。

也许循环通过php?

【问题讨论】:

  • 我不太明白你想要达到什么目的。您能否更详细地解释您的预期结果。为什么“a,b”配对折叠成一个结果,而“c,d”配对折叠成两个?
  • 我编辑了这个例子。我想要的是只为同一对城市/地区添加连续的范围,即 a-b:10-20 + 21-30 + 31-33。对于 c-d 我只能加入前 2 个范围:34-40 + 41-59 但不是 70-100,因为我将在 60-69 范围内有一个“洞”
  • 在包含所有数据(预处理)的表中有/期望有多少行?
  • 原表超过20万行;我想将它减少到尽可能少的行数。即如果可能,每个城市/地区组合 1 行;但是这是不可能的,因为并非所有范围都是连续的

标签: php mysql merge row


【解决方案1】:

好的,我想我已经设法解决了这个问题。假设没有一个范围重叠,我认为这是可行的:

SET @group = 1, @current:= 0;
SELECT city,district,MIN(start_num),MAX(end_num) FROM (
  SELECT 
    *,
    IF((start_num-@current)=1,(@group),(@group:=@group+1)) AS contiguent_group,
    @current:=end_num 
  FROM `testtable`) AS contiguous
GROUP BY city,district,contiguent_group

如果您在同一个城市/地区组合中有两个单独的连续组,它甚至应该可以工作。

【讨论】:

    猜你喜欢
    • 2021-08-13
    • 2018-03-22
    • 2017-07-11
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2018-12-09
    相关资源
    最近更新 更多