2012-07-16 25 views
0

有點令人困惑,所以如果我放下示例和預期輸出開始,它會更容易。如何使用MySQL中的最新更新值合併列數據?

我有一個表可能看起來是這樣的:(1單元 - UNIT2列可以跨越多達30列在相同的一般格式)

| ID | Name | Unit1_left | Unit2_left | 
| 1 | Tom |  50  |  NULL | 
| 2 | Tom | NULL |  1  | 
| 3 | Tom |  45  |  NULL | 
| 4 | Dan | NULL |  NULL | 

我試圖選擇是這樣的一個表:

| Name | Unit1_left | Unit2_left | 
| Tom |  45  |  1  | 
| Dan | NULL |  NULL | 

那是什麼做的是按名稱分組,並試圖如果存在的話(如果沒有則返回NULL)找到了2個其他列的最後一個值。

我看了各種其他問題,他們都說使用Max()但是這不會工作,因爲它選擇最高值(不正確)。我已經看到在MsSQL中有一個Last()函數,看起來有點像我希望它做的事情,但它沒有在MySQL中實現,並且不是我所需要的。

我想問的是,有沒有人知道選擇這樣的數據的可能方法,或者如果我將不得不使用單獨的編程語言來做到這一點?

+1

你用什麼標準來判斷'其他兩列中的最後一個值'? – 2012-07-16 18:06:39

+0

不完全確定你的意思,但基本上可以說這個表是按ID升序排列的,其中'Name' = Tom。我不能輕易解釋它,但讓我們說當你點擊一個我希望它選擇的數字的時候,你反過來查看「Unit1_Left」欄(45,NULL,50)。 'Unit2_left'也一樣。希望這解釋得比我在第一篇文章中寫得好一點。 – 2012-07-16 18:14:46

+0

換句話說,你爲什麼選擇Tom的'45'值而不是'50'?是否因爲列ID中的值較高? – 2012-07-16 18:19:23

回答

1

這將產生設置你通過創建2只在線欣賞到最高ID爲兩個unit1_left和unit2_left(L1非空值描述

SELECT dname.name, 
     l1value.unit1_left, 
     l2value.unit2_left 
FROM (SELECT DISTINCT `name` 
     FROM table1) `DName` 
     LEFT JOIN (SELECT `name`, 
         Max(id) id 
        FROM table1 
        WHERE unit1_left IS NOT NULL 
        GROUP BY `name`) l1 
       ON dname.`name` = l1.`name` 
     LEFT JOIN table1 l1value 
       ON l1.id = l1value.id 
     LEFT JOIN (SELECT `name`, 
         Max(id) id 
        FROM table1 
        WHERE unit2_left IS NOT NULL 
        GROUP BY `name`) l2 
       ON dname.`name` = l2.`name` 
     LEFT JOIN table1 l2value 
       ON l2.id = l2value.id ; 

DEMO

我做這件事的結果和l2)。然後將其加回到原始表中以獲取值(l1value和l2value)。然後,我們將其加入到第三個內聯視圖(dname)中,該視圖創建不同的名稱。

這是非常混亂,它可能更有意義,只是保持在一個更合理的方式您的數據。

+0

謝謝,這正是我之後的......數據沒有以合理的方式保存的原因是因爲我無法控制事物的這一方面。數據直接從網站中提取,然後解析到本地數據庫中,我只能從中選擇。我試圖找到一種使數據更容易使用的方法,這是需要此代碼的原因。再次感謝! – 2012-07-16 18:32:10

0

您可以在select語句中使用子查詢。使用SqlFidlle我想出了this

select o.name, 
     (select o2.Unit1_left 
     from original as o2 
     where o.name = o2.name 
      and o2.Unit1_left is not null 
     order by o2.id desc 
     LIMIT 1) as Unit1_left, 
     (select o3.Unit2_left 
     from original as o3 
     where o.name = o3.name 
      and o3.Unit2_left is not null 
     order by o3.id desc 
     LIMIT 1) as Unit2_left 
    from original as o 
     group by o.name 
     order by id; 
相關問題