2016-05-06 7 views
0

このような多くの質問はすでにstackoverflowにありますが、私の最小限の知識はSQLにまとめられていません。一つの巨大なSQLテーブルから行を結合してください

テーブルは次のようになります。私は1000 Player_Idのと200 Stat_Idの

PlayerID | StatsID | StatValue 
================================== 
1   | 1  | 99 
1   | 2  | 31 
1   | 3  | 1 
2   | 1  | 102 
2   | 2  | 1 
2   | 3  | 33 
3   | 1  | 0 
3   | 2  | 1 
3   | 3  | 3,4 

を持っていると私は1つのユーザーオブジェクトは、次のようになり、ユーザーの配列を取得したいと思います:

{playerId:1, stats:{"1":99, "2":31, "3":1, ...}} 

が、私は多くのことを試してみましたが、何も何の近隣にあり私はやりたいこのSQLで、私は私の最高の結果を得た:

SELECT `PlayerID`, 
    GROUP_CONCAT(`StatsID` SEPARATOR ', ') 
    FROM `player_stats` 
    WHERE 1 group by `PlayerID` 

ここでは結果である:私は私のクエリにStatValue列をもたらすことができる方法

Array 
(
    [0] => Array 
    (
     [PlayerID] => 15895 
     [stats] => 1, 2, 3 
    ) 

[1] => Array 
    (
     [PlayerID] => 21307 
     [stats] => 1, 2, 3 
    ) 

? SQLクエリの後または複数のクエリを使用して目的のオブジェクトを生成する方が良いでしょうか?

パフォーマンスはそれほど重要ではありませんが、「playerId-array」を生成するには年齢がかかりません。

ありがとうございます!

+0

。可能であれば、私は一般的にこれをサーバ側でもっと簡単に行うことができます。残念ながら、私は実際にリテラルの実装に役立つPHPやmySqlについて十分に知りません。 MS SQLのようなものでは、***はXMLやJSONを返すことで階層的なデータを表現できますが、サーバー上のオブジェクトを使っています。 – Kritner

+0

PHPを使って出力をループし、統計を爆発させ、2番目のループを使って配列を再作成します – Poria

答えて

1

試してみてください:あなたは階層的にフラグSQLデータ/結果を表現しようとしている

SELECT `PlayerID`, GROUP_CONCAT(`StatsID`, ':', StatValue SEPARATOR ', ') as stats 
FROM `player_stats` 
GROUP BY `PlayerID`; 
+0

うわー、ありがとう!それは完璧だった!中括弧の後ろに "AS Stats"を追加しました! – olaf

0

あなたが実際にちょうどGROUP_CONCAT()に列を追加することができます

SELECT `PlayerID`, `StatsValues` FROM (
    SELECT `PlayerID`, CONCAT(`StatsID`, ',', GROUP_CONCAT(`StatsValues` SEPARATOR ', ')) AS `StatsValues` 
    FROM tblName 
    GROUP BY `PlayerID`, `StatsID`); 
関連する問題