MySQL独立选择跨多个列的最后一个值,该值不为空

标签 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;

这没有用。

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

最佳答案

如果您可以将类型更改为字符,您可以这样做:

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 删除第一列。 substring_index 根据需要在 NULL 上返回 NULL。
  • 如果您需要结果列为 INT,则需要再次转换每一列。

关于MySQL独立选择跨多个列的最后一个值,该值不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29816113/

相关文章:

mysql - MySQL 查询中 EXPLAIN、count(1) 和表内容之间的差异

Mysql 使用 utf8 varchar 字段查找不正确

mysql - Knockout.js 从 mysql 数据库更新值

php - mySql @变量在不同客户端的行为有所不同

mysql 命令行转义 - 标志

javascript - 如何根据我的验证设置选择选项

php - 是否可以在加载时发送 AJAX 请求?

c# - 尝试插入日期时间时 MySQL 出错

sql - 在 WHERE 谓词解决方法中配置多个子查询

mysql : select one id from multiple id which have multiple value