如何使用MySQL中的最后更新值合并列数据?

时间:2012-07-16 18:04:18

标签: mysql sql

有些令人困惑,所以如果我放下示例和预期的输出就会更容易。

我有一个表格看起来像这样:( Unit1 - Unit2列可以以相同的通用格式跨越多达30列)

| ID | Name | Unit1_left | Unit2_left |
| 1  | Tom  |     50     |     NULL   |
| 2  | Tom  |    NULL    |      1     |
| 3  | Tom  |     45     |     NULL   |
| 4  | Dan  |    NULL    |     NULL   |

我想要选择的是这样一个表格:

| Name | Unit1_left | Unit2_left |
| Tom  |     45     |      1     |
| Dan  |    NULL    |     NULL   |

正在做的是按名称分组并尝试查找其他2列中的最后一个值(如果不存在则返回NULL)。

我已经查看了其他各种问题,并且他们都说要使用Max()但是这不会起作用,因为它选择了最高值(不正确)。我已经看到在MsSQL中有一个Last()函数看起来模糊地像我想要它做的但它没有在MySQL中实现,并且不是我需要的。

我想问的是,有没有人知道选择这样的数据的可能方法,或者我是否必须使用单独的编程语言来做这件事?

2 个答案:

答案 0 :(得分:1)

这将生成您描述的结果集

SELECT dname.name, 
       l1value.unit1_left, 
       l2value.unit2_left 
FROM   (SELECT DISTINCT `name` 
        FROM   table1) `DName` 
       LEFT JOIN (SELECT `name`, 
                         Max(id) id 
                  FROM   table1 
                  WHERE  unit1_left IS NOT NULL 
                  GROUP  BY `name`) l1 
              ON dname.`name` = l1.`name` 
       LEFT JOIN table1 l1value 
              ON l1.id = l1value.id 
       LEFT JOIN (SELECT `name`, 
                         Max(id) id 
                  FROM   table1 
                  WHERE  unit2_left IS NOT NULL 
                  GROUP  BY `name`) l2 
              ON dname.`name` = l2.`name` 
       LEFT JOIN table1 l2value 
              ON l2.id = l2value.id ;

DEMO

我是通过为unit1_left和unit2_left(l1和l2)的非空值的最高id创建2个内联视图来实现的。然后将它连接回原始表以获取值(l1value和l2value)。然后我们将它连接到第三个内联视图(dname),创建不同的名称。

它非常混乱,只是以更合理的方式保存您的数据可能更有意义。

答案 1 :(得分:0)

您可以在select语句中使用子查询。使用SqlFidlle我想出了this

select o.name,
      (select o2.Unit1_left 
         from original as o2
         where o.name = o2.name
             and o2.Unit1_left is not null
         order by o2.id desc
         LIMIT 1) as Unit1_left,
      (select o3.Unit2_left 
         from original as o3
         where o.name = o3.name
             and o3.Unit2_left is not null
         order by o3.id desc
         LIMIT 1) as Unit2_left
    from original as o 
       group by o.name
       order by id;