0

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

我有一个看起来像这样的表:(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 中实现,也不是我需要的。

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

4

2 回答 2

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 ;

演示

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

这很混乱,只是以更明智的方式保存数据可能更有意义。

于 2012-07-16T18:16:15.683 回答
0

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

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;
于 2012-07-16T18:20:02.553 回答