这是我正在处理的一个示例数据集:
+----+-----+-----+-----+-----+
| 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;
这不起作用。
我是否必须单独为每个值运行查询,或者是否有办法在一个查询中执行此操作?
答案 0 :(得分:3)
如果您可以将类型更改为char,则可以执行以下操作:
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
删除第一列。 NULL上的substring_index
根据需要返回NULL。