2011-12-06 32 views
4

我試圖將下表轉換爲更容易查詢的東西。歷史數據非常重要,因此它不能被拋棄,並且變量的選項數量不確定(我只需要最終結果中的一些)。如何將Key/Value樣式錶轉換爲MySQL中的普通表格

這幾乎正是我需要做的,但它沒有考慮歷史數據,並假設變量是獨一無二的USER_ID在我的情況下,USER_ID可以有3個或同一變量的4我需要最新的一個。 見>MySQL Pivot Table

| UUID |UUID_User |Variable |Value  |DateSet    | 
|--------|----------|----------|----------|---------------------| 
| X123Y |123XX12 |FirstName |Jane  | 2011-07-09 14:13:12 | 
| X126Y |123XX12 |LastName |Jones  | 2011-07-09 14:13:12 | 
| X173Y |123XX62 |FirstName |Joe  | 2011-07-09 14:11:12 | 
| X143Y |123XX62 |LastName |Smith  | 2011-07-09 14:11:12 | 
| X129Y |123XX12 |LastName |Smith  | 2011-11-09 14:13:12 | << Jane Gets Married 

變換到上述(確保使用簡最新的姓氏條目)

|UUID_User |FirstName |LastName | 
|----------|----------|----------| 
|123XX12 |Jane  |Smith  | 
|123XX62 |John  |Smith  | 

回答

2

獲取每個用戶最新的條目是一個普遍的問題,往往是在Stack Overflow上標記爲greatest-n-per-group。我建議爲此創建一個VIEW,但這不是絕對必要的。

CREATE VIEW LatestKeyValue AS 
SELECT k1.* 
FROM KeyValue AS k1 
LEFT OUTER JOIN KeyValue AS k2 
    ON (k1.UUID_User, k1.Variable) = (k2.UUID_User, k2.Variable) 
    AND k1.DateSet < k2.DateSet 
WHERE k2.DateSet IS NULL 

然後你就可以轉動,對於每一個你在幾個不同的方式需要如下面的變量:

SELECT UUID_User, 
    MAX(CASE Variable WHEN 'FirstName' THEN Value END) AS FirstName, 
    MAX(CASE Variable WHEN 'LastName' THEN Value END) AS LastName 
FROM LatestKeyValue 
GROUP BY UUID_User 
+0

BINGO,這個觀點正是我需要什麼,看看我要去哪裏錯了。這正是我所需要的,謝謝你。 – digitalgecko

+0

檢查對應於您的MariaDB服務器版本的手冊,以找到'THEN –

+0

@HelgaIliashenko附近使用的正確語法,我不使用MariaDB。但是你是對的,我在我的SQL語法中犯了一個錯誤,我想我已經糾正了它。感謝downvote。 –

相關問題