2013-10-25 23 views
-1

我有一個MySQL數據庫表中有許多列可以爲空(空)。 我想在一個結果中爲一臺機器的每一列排新的值。所以,如果爲null,則該值將是一個較舊的行,如下所示。Mysql只獲得最新的記錄,其中列設置,並從下一行獲得空列

表內容:

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 

什麼會得到這個聚合結果最好的查詢?

+0

爲什麼motorSpeed的預期結果是200而不是400? – cen

+0

因爲200是機器'001'的最新值。 400屬於機器'002' – HyVi

回答

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