-1

我有一个 MySQL 数据库表,其中许多列可以为空(null)。我想在一个结果行中为一台机器的每一列提供最新值。因此,如果为 null,则该值将是一个较旧的行,如下图所示。

表格内容:

id name motorSpeed motorDelay F1type F2type F3type
1  001  200        null       1      null   null
2  002  400        0          0      0      0
3  001  null       50         0      1      1

期望的结果:

id name motorSpeed motorDelay F1type F2type F3type
3  001  200        50         0      1      1

获得此汇总结果的最佳查询是什么?

4

2 回答 2

1

我怀疑name是关键,它不能为空。此外,您希望获取 name=001 的“最新”值。

SELECT a.id, b.name, c.motorSpeed, d.motorDelay, e.F1type, f.F2type, g.F3type
FROM
    (SELECT * FROM table WHERE id IS NOT NULL ORDER BY id DESC LIMIT 1) a
LEFT JOIN
    (SELECT * FROM table WHERE name IS NOT NULL ORDER BY id DESC LIMIT 1) b ON b.name=a.name
LEFT JOIN
    (SELECT * FROM table WHERE motorSpeed IS NOT NULL ORDER BY id DESC LIMIT 1) c ON c.name=a.name
LEFT JOIN
    (SELECT * FROM table WHERE motorDelay IS NOT NULL ORDER BY id DESC LIMIT 1) d ON d.name=a.name
LEFT JOIN
    (SELECT * FROM table WHERE F1type IS NOT NULL ORDER BY id DESC LIMIT 1) e ON e.name=a.name
LEFT JOIN
    (SELECT * FROM table WHERE F2type IS NOT NULL ORDER BY id DESC LIMIT 1) f ON f.name=a.name
LEFT JOIN
    (SELECT * FROM table WHERE F3type IS NOT NULL ORDER BY id DESC LIMIT 1) g ON g.name=a.name
WHERE a.name='001';
于 2013-10-25T14:57:55.293 回答
0
SELECT ID,
       NAME,
       CASE WHEN MOTORSPEED IS NULL
            THEN MIN(MOTORSPEED)
            ELSE MOTORSPEED
        END AS MOTORSPEED,
       CASE WHEN MOTORDELAY IS NULL
            THEN MAX(MOTORDELAY)
            ELSE MOTORDELAY
        END AS MOTORDELAY,
       CASE WHEN F1TYPE IS NULL
            THEN MAX(F1TYPE)
            ELSE F1TYPE
        END AS F1TYPE,  
       CASE WHEN F2TYPE IS NULL
            THEN MAX(F2TYPE)
            ELSE F2TYPE
        END AS F2TYPE,
       CASE WHEN F3TYPE IS NULL
            THEN MAX(F3TYPE)
            ELSE F3TYPE
        END AS F3TYPE
FROM YOURTABLE;
于 2013-10-25T14:45:43.283 回答