MySQL独立地选择多个非空的列的最后一个值

时间:2015-04-23 07:07:19

标签: mysql select

这是我正在处理的一个示例数据集:

+----+-----+-----+-----+-----+
| 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;

这不起作用。

我是否必须单独为每个值运行查询,或者是否有办法在一个查询中执行此操作?

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;

SqlFiddle here

注意:

  • 需要中间派生表,因为需要订购GROUP_CONCAT的输入。
  • 使用GROUP_CONCAT压缩行(使用默认的逗号分隔符)后,我们使用substring_index删除第一列。 NULL上的substring_index根据需要返回NULL。
  • 如果您需要将结果列设为INT,则需要再次投射每列。