有些令人困惑,所以如果我放下示例和预期的输出就会更容易。
我有一个表格看起来像这样:( 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中实现,并且不是我需要的。
我想问的是,有没有人知道选择这样的数据的可能方法,或者我是否必须使用单独的编程语言来做这件事?
答案 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 ;
我是通过为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;