2013-10-08 7 views
5

私はこのようなTB1テーブル持っている:私は、クエリでデータを呼び出すとMySQLのGROUP_CONCATとDISTINCT

name email    link 
john [email protected] google 
john [email protected] facebook 
john [email protected] twitter 
.... 
.... 
and more 

SELECT name, email, group_concat(DISTINCT link SEPARATOR '/') as source 
FROM tb1 
group by email 

のように見え、このような結果:

NAME EMAIL    SOURCE 
john [email protected] twitter 
john [email protected] facebook/google 
.... 
.... 
and more 

sqlfiddle

メイクの結果は次のようになります:

NAME EMAIL    SOURCE 1  SOURCE 2 
john [email protected] twitter 
john [email protected] facebook  google 

結果はクエリでのみ作成できますか?

注:私はあなたがMySQLで以来、あなたは動的に追加の列を作成することはできませんすることはできません....ダイナミック列ソース1、2、3を作りたい、nは

+0

これはバリエーションのピボットテーブルです(理論的には、ソース1、ソース2 .... X個の異なるソース値に基づいてソースXに進むことができますか?)そうであれば、 "mysqlピボットテーブル" [MySQLピボットテーブル](http:// stackoverflow)の重複した可能性のあるいくつかの偉大な(たとえ軽微ではない)記事があります。 – AgRizzo

+0

com/questions/7674786/mysql-pivot-table) – ModulusJoe

+0

ref @AgRizzoに感謝します。私はmysqlピボットテーブルについて読んでいます。この質問は成立する。私はmysqlピボットテーブルについたときに私の質問を更新します。 – itx

答えて

1

...(これはもっとあります

+1

彼はダイナミックなことは一度も言及していません – AdrianBR

+0

@AdrianBRそれが動的でなければ私の答えはうまくいくが、質問者はそれを確認する必要がある。 –

1

このケースでは動作しますが、ダイナミッククエリではなく、同じメールに最大2つのリンクが存在する場合にのみ動作します。

SELECT `name`, email, 
substring_index(group_concat(DISTINCT link SEPARATOR '/'),'/',1) as source_1, 
if(group_concat(DISTINCT link SEPARATOR '/') like '%/%', 
substring_index(group_concat(DISTINCT link SEPARATOR '/'),'/',-1),'') as source_2 
FROM test2 group by email 

メールごとに存在する可能性のあるリンクの正確な数を知っている場合は、それに応じて同じクエリを変更することができます。

+1

は、うまく動作します。 – AdrianBR

2

私の答えは、しないでください!

あなたがしたいことは、ピボットと呼ばれます。 MySQLでは、これは通常

.... 
aggregate_function(case when ...), 
aggregate_function(case when ...), 
aggregate_function(case when ...), 
... 

ブロックの1つの地獄で行われます。しかし、あなたがあなたのソースをすべて知っているわけではないので、あなたのためにステートメントを動的に構築して実行する手続きを書く必要があります。そして、たとえそうであっても、

NAME EMAIL    twitter  facebook google 
---------------------------------------------------------- 
john [email protected] yes   no   no 
john [email protected] no   yes   yes 

のようなテーブル構造になってしまいます。どのようにアプリケーションのプログラマーが列の名前を知っていますか?

これを避けるには、ストアドプロシージャのプログラミングをもう一度やり直して、各電子メールの行の値を1つの列に配置する必要があります。それではどのようにしてどの列がどの列に入るのでしょうか? facebookが列source1の1つの行と列2の列の別の行に表示されるとどうなりますか?そしてあなたのアプリケーションでは、実際にどれくらいの数のカラムがあるかをテストしなければならないか、あるいは各ユーザ/電子メールに2つのソースしかないのかを判断する必要があります。物事をまとめると

、この

name email    link 
john [email protected] google 
john [email protected] facebook 
john [email protected] twitter 

のような結果が完全に罰金です、それはそれに対処するために、アプリケーション開発者次第です。そして、あなたのチームのデータベース担当者よりもずっと簡単です。