【问题标题】:MariaDB/MySQL: combine rows if fields are NULLMariaDB/MySQL:如果字段为 NULL,则合并行
【发布时间】:2017-09-20 15:40:30
【问题描述】:

假设我有一个 6 行的表,第一个是自动递增的数字 ID,第二个是 DateTime(自动设置),最后 4 个是传感器值:

ID  DateTime    Val1    Val2    Val3    Val4
1   xxx         20      10      NULL    NULL
2   xxx         NULL    NULL    30      15
3   xxx         23      14      NULL    NULL
4   xxx         25      04      NULL    NULL
5   xxx         12      11      NULL    NULL
6   xxx         NULL    NULL    33      19

传感器数据通常会自动写入数据库。可能每天有几次手动数据被添加到 Val3 和 Val4。现在我必须从数据库中加载最新的行。如果我这样做:

SELECT Val1,Val2,Val3,Val4 FROM table ORDER BY ID DESC LIMIT 1

我得到一个带有 Val1 和 2 或 3 和 4 的行。虽然我需要这种方式,但上面的示例是关于:

5 | xxx | 12 | 11 | 30 | 15

or

6 | xxx | 12 | 11 | 33 | 19

最后一行的值 + 最后一行的缺失值,其中包含非 NULL 值。有人可以解释一下如何做到这一点吗?在 Raspberry Pi 3 上运行 MariaDB 10 数据库。

【问题讨论】:

    标签: php mysql database mariadb


    【解决方案1】:

    这种查询需要一些可变的技巧才能查看最后一行。

    为了更具体地展示解决方案:

    MariaDB [test] create table test2 (
        id int primary key not null auto_increment, 
        ts timestamp not null default current_timestamp, 
        val1 int,val2 int,val3 int,val4 int
    );
    Query OK, 0 rows affected (0.43 sec)
    
    MariaDB [test] insert into test2 (val1,val2,val3,val4) values
        (20,10,null,null),
        (null,null,40,25),
        (23,14,null,null),
        (25,4,null,null),
        (12,11,null,null),
        (null,null,33,19);
    Query OK, 6 rows affected (0.07 sec)
    Records: 6  Duplicates: 0  Warnings: 0
    
    MariaDB [test] select * from (
        select t.id as id, t.ts, 
            @val1 := coalesce(t.val1,@val1) as val1, 
            @val2 := coalesce(t.val2,@val2) as val2, 
            @val3 := coalesce(t.val3,@val3) as val3, 
            @val4 := coalesce(t.val4,@val4) as val4 
        from test2 t, (select @val1 := 0,@val2:=0,@val3:=0,@val4:=0) as start order by id
    ) x ;
    
    +----+---------------------+------+------+------+------+
    | id | ts                  | val1 | val2 | val3 | val4 |
    +----+---------------------+------+------+------+------+
    |  1 | 2017-09-20 06:53:41 | 20   | 10   | 0    | 0    |
    |  2 | 2017-09-20 06:53:41 | 20   | 10   | 40   | 25   |
    |  3 | 2017-09-20 06:53:41 | 23   | 14   | 40   | 25   |
    |  4 | 2017-09-20 06:53:41 | 25   | 4    | 40   | 25   |
    |  5 | 2017-09-20 06:53:41 | 12   | 11   | 40   | 25   |
    |  6 | 2017-09-20 06:53:41 | 12   | 11   | 33   | 19   |
    +----+---------------------+------+------+------+------+
    6 rows in set (0.01 sec)
    

    【讨论】:

      【解决方案2】:

      我将很少修改您的查询如下:

      SELECT Val1,Val2,Val3,Val4 FROM table where (Val3 and Val4) is not null ORDER BY ID DESC LIMIT 1
      

      希望这会有所帮助...!!!

      【讨论】:

      • 可悲的是,这只会给我最后一行包含值的行。第一个值仍然是 NULL'ed。 ://
      • 看来我需要单独加载每个字段,然后在 PHP 中组合它们......
      【解决方案3】:

      以下查询将解决您的问题。

      SELECT
          (SELECT Val1 FROM table where Val1 IS NOT NULL ORDER BY ID DESC LIMIT 1) as Val1,
          (SELECT Val2 FROM table where Val2 IS NOT NULL ORDER BY ID DESC LIMIT 1) as Val2,
          (SELECT Val3 FROM table where Val3 IS NOT NULL ORDER BY ID DESC LIMIT 1) as Val3,
          (SELECT Val4 FROM table where Val4 IS NOT NULL ORDER BY ID DESC LIMIT 1) as Val4;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-16
        • 1970-01-01
        • 2019-02-07
        • 2023-04-10
        • 2015-10-10
        • 2023-04-05
        • 2012-04-30
        • 1970-01-01
        相关资源
        最近更新 更多