2013-06-18 9 views
7

PHPとMySQLデータベースを使用してApacheで動作するように私が最初に書いたアプリケーションを移植しています。クエリの1つはConcat_WSGroup_ConcatのMySQL関数を使用して、最初にいくつかの異なる列を1つの文字列に連結し、次にGroup_By節でグループ化されたすべての項目を連結します。一例として、SQL ServerでMYSQLのGroup_Concatを実現

ID Name Candy 
1  John M&Ms 
1  John KitKat 

クエリ:結果

Select Group_Concat(Concat_WS('-',Name, Candy) Separator '00--00') as UserCandy 
From ExampleTable 
Group By ID 

:今

UserCandy 
John-M&Ms00--00John-KitKat 

は、私が使用してSQL Server 2008で同じ結果を達成しようとしていますPHP 5.4以上。

私が試したもの:

SELECT Stuff(name + ';' + candy, 1, 0, '-----') AS UserCandy 
FROM test 

問題can be seen in the fiddle that I have setup

期待される結果は次のようになります。

-----John;MMs-----John;KitKat 

最後に、私はミックスに複数の列を追加するとき、これはさらに困難になります。私はIDが同じ場所に結果をマージしたい(上記のように)。これは、グループ化された行を自動的にマージするため、group_concatと非常によく動作します。

+1

@bluefeet私はすでにその質問を見ましたが、私はXMLの使用を避けようとしています。私は以前のバージョンのアプリで使っていたのと同じフォーマットを維持したかったのです。 –

+0

必要な形式でデータを取得する方法はありますが、SQLサーバーでは複数の行のデータを1つのデータに簡単に連結する方法はありません。 – Taryn

+1

@bluefeetどうすればこの質問を変更して、回答が得られ、閉じられないようにすることができますか?私は今日主題について大量の読書をしましたが、私はまだそれを自分で手に入れていません(明らかに私が今ここにいるように) –

答えて

7

これは、2段階プロセスを使用して行うことができます。

最初に、Common Table Expressionを使用して、namecandyの最初の連結を実行できます。最初の部分はクエリを使用します。

;with cte as 
(
    select id, name+';'+ candy UserCandy 
    from table_test 
) 
select * 
from cte 

Demoを参照してください。これは、結果を与える:

| ID | USERCANDY | 
-------------------- 
| 1 | John;MMs | 
| 1 | John;KitKat | 

初期連結が完了したら、あなたは最終的な結果を得るためにFOR XML PATHSTUFFを使用することができます。

;with cte as 
(
    select id, name+';'+ candy UserCandy 
    from table_test 
) 
select distinct c.id, 
    STUFF(
     (SELECT '-----' + c2.UserCandy 
      FROM cte c2 
      where c.id = c2.id 
      FOR XML PATH ('')) 
      , 1, 0, '') AS UserCandy 
from cte c; 

SQL Fiddle with Demoを参照してくださいします。結果は次のようになります。

| ID |      USERCANDY | 
-------------------------------------- 
| 1 | -----John;MMs-----John;KitKat | 
+0

私は本当にこの答えに感謝します。実際のデータセットと一緒に使ってみるつもりですが、これは私が投稿したものよりずっと複雑です。私はそれが期待どおりに動作するように努力しますが、もしできないのであれば、私はここにいくつか投稿します。再度、感謝します。 –

+0

これは完全に機能しました。正直で何が欠けていたのか分かりません。私は、クエリが2つの部分に分割されたという事実は、そのトリックをしたものだと思います。答えが出ているにもかかわらず、私はそれらのどれにも運がなかったので、これを閉じるために急いでいないことを感謝します。 –

+0

@Whathaveyoutried私はあなたが働いてうれしいです。 – Taryn