这是我正在处理的示例数据集:
+----+-----+-----+-----+-----+
| id | a | b | c | d |
+----+-----+-----+-----+-----+
| 1 | 1 | | | |
| 2 | | 2 | | |
| 3 | | | | |
| 4 | | | | 4 |
| 5 | | 3 | | |
+----+-----+-----+-----+-----+
我想选择最底部的值。如果这个值从未被设置过,那么我想要“null”,否则,我想要最底部的结果。在这种情况下,我想要结果集:
+-----+-----+-----+-----+
| a | b | c | d |
+-----+-----+-----+-----+
| 1 | 3 | | 4 |
+-----+-----+-----+-----+
我尝试了以下变体的查询:
SELECT DISTINCT `a`,`b`,`c`,`d`
FROM `test`
WHERE `a` IS NOT NULL
AND `b` IS NOT NULL
AND `c` IS NOT NULL
AND `d` IS NOT NULL
ORDER BY 'id' DESC LIMIT 1;
这没有用。
我是否必须针对每个值单独运行查询,或者有没有办法只在一个查询中执行此操作?
最佳答案
如果您可以将类型更改为字符,您可以这样做:
SELECT substring_index(GROUP_CONCAT(a),',',1) as LastA,
substring_index(GROUP_CONCAT(b),',',1) as LastB,
substring_index(GROUP_CONCAT(c),',',1) as LastC,
substring_index(GROUP_CONCAT(d),',',1) as LastD
FROM
(
SELECT id, a, b, c, d
FROM MyTable
ORDER BY id DESC
) x;
注意事项:
- 需要中间派生表,因为需要对
GROUP_CONCAT
的输入进行排序。 - 在使用
GROUP_CONCAT
(使用默认的逗号分隔符)压缩行后,我们使用substring_index
删除第一列。substring_index
根据需要在 NULL 上返回 NULL。 - 如果您需要结果列为 INT,则需要再次转换每一列。
关于MySQL独立选择跨多个列的最后一个值,该值不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29816113/