2011-12-06 6 views
4

次の表を照会するのが少し簡単になるように変換しようとしています。履歴データは重要なので、捨てることはできず、変数のオプションが不定になります(私は最終結果にそれらの一部しか必要ありません)。キー/値スタイルテーブルを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

(ジェーンのための最新の姓エントリを使用して確認すること)に上記の変換を参照してください。多くの場合、ある共通の問題ですスタックオーバーフローのタグ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ありがとう。 –

関連する問題