2015-12-19 63 views
2

簡單問題:什麼是從自定義數據透視表檢索字符串的正確方法。有沒有比MAX(CASE WHEN _ad.key = 'first_name' THEN _ad.value ELSE '' END) AS first_name更好的方法mysql pivot檢索字符串

我的表工作正常,我的問題是如何檢索單個字符串,我發現每個問題都是問如何聚合行以找到一堆行的總和。我的情況有更好的解決方案嗎?由於只有一個返回值,它將始終是最大值。

dev.mysql.com:「MAX()可能需要一個字符串參數;在這種情況下,它會返回最大字符串值。」

這是我的查詢的最小化版本。

SELECT 
    _a.id_account, 
    MAX(CASE WHEN _ad.`key` = 'first_name' THEN _ad.`value` ELSE '' END) AS first_name, 
    MAX(CASE WHEN _ad.`key` = 'last_name' THEN _ad.`value` ELSE '' END) AS last_name 

FROM 
    `account` _a 
     LEFT JOIN account_data _ad USING(id_account) 

GROUP BY 
    _a.id_account; 



|---------------------------------------- 
|account 
|---------------------------------------- 
|id_account | 
|1   | 
|2   | 
|---------------------------------------- 

|---------------------------------------- 
|account_data 
|---------------------------------------- 
|id_account |key   |value 
|1   |first_name |OneFirst 
|1   |last_name  |OneLast 
|2   |first_name |TwoFirst 
|---------------------------------------- 

|---------------------------------------- 
|mypivot 
|---------------------------------------- 
|id_account |first_name |last_name 
|1   |OneFirst  |OneLast 
|2   |TwoFirst  | 
|---------------------------------------- 
+0

一兩件事,可能是有益的是,如果你有很多的關鍵值,你可以使用動態支點,讓MySQL的建立所有那些'MAX(CASE WHEN..'爲你,就像http://stackoverflow.com/a/28284999/1745672 – Mihai

+0

@Mhaihai感謝您的參考它可能會有所幫助,對於這個查詢,我試圖避免子查詢 – Bradmage

回答

2

我相信你的方法很好,我會按照你的方式寫它。

隨着pivoting,你將不得不根據你的pivot id_account進行分組。如果存在,可以通過first_name關鍵字的最大值來派生名字。你做到了,你用last_name重複了這一點。這非常好,它會給你帶來正確的結果。因此,從我看到的情況來看,你很好。

+0

甜蜜的感謝,我曾半期待整個人騷擾我存儲數據的方式,而不回答我的問題,所以謝謝:) – Bradmage

-1

這給一試:

IFNULL(MAX(first_name), '') 
+0

這是在低質量的帖子隊列。請編輯你的答案並解釋它爲什麼會起作用。 –

+0

我同意,這個查詢不會做任何事情。你還沒有創建'first_name'首先進行測試。 – Bradmage