2

member_idフィールドとして、member_nameclub_nameregionを持つテーブル メンバーがありzoneますemail

次のようなMySQLgroup_concat関数を使用しています

SELECT group_concat(distinct m.email
SEPARATOR ', ' ) from member m group by m.club_name

これはうまくいっています。group_concatしかし、追加のクエリを作成せずに他のフィールドでできるようにしたいと思います。

他のフィールドをパラメーターとして指定することはできますか?

member_id   member_name club_name   region  zone    email
1           member1           A        1    1   email1@example.com
2           member2           A        1    1   email2@example.com
3           member3           B        1    1   email3@example.com
4           member4           C        1    2   email4@example.com
5           member5           D        2    1   email5@example.com

**group by club**
email1@example.com,email2@example.com
email3@example.com
email4@example.com
email5@example.com

**group by region**
email1@example.com, email2@example.com, email3@example.com, email4@example.com
email5@example.com

**group by zone**
email1@example.com, email2@example.com, email3@example.com
email5@example.com

すべての地域に 3 つのゾーンがあり、すべてのゾーンに複数のクラブがあるとします。地域、ゾーン、クラブにグループ化または関連するメールを取得するにはどうすればよいですか?

4

1 に答える 1

9

あなたの質問から正確に何を求めているのかを理解するのは難しいですが、試すことができます

SELECT club_name,
       GROUP_CONCAT(DISTINCT email SEPARATOR ', ' ) emails,
       GROUP_CONCAT(DISTINCT member_name SEPARATOR ', ' ) members
       ... 
 FROM member
GROUP BY club_name

出力例:

| | CLUB_NAME | メール | メンバー |
-------------------------------------------------- ----------------------
| | クラブ1 | m1@mail.com、m2@mail.com、m3@mail.com | ジョン、マーク、ベス |
| | クラブ2 | m4@mail.com, m5@mail.com | トーマス・ヘレン |

これがSQLFiddleのデモです

余談です が、このような質問でサンプルデータと目的の出力を提供すると、通常、回答をより迅速に取得するための変更が改善され、ニーズに最適になります。

更新:GROUP_CONCAT()必要に応じて、さまざまなセパレーターを使用して情報を深くパックできます

SELECT 'club' group_type, GROUP_CONCAT(details SEPARATOR '|') details
  FROM
(
  SELECT CONCAT(club_name, ';', GROUP_CONCAT(DISTINCT email)) details
    FROM member
   GROUP BY club_name
) a
UNION ALL
SELECT 'region' group_type, GROUP_CONCAT(details SEPARATOR '|') details
  FROM
(
  SELECT CONCAT(region, ';', GROUP_CONCAT(DISTINCT email)) details
    FROM member
   GROUP BY region
) a
UNION ALL
SELECT 'zone' group_type, GROUP_CONCAT(details SEPARATOR '|') details
  FROM
(
  SELECT CONCAT(zone, ';', GROUP_CONCAT(DISTINCT email)) details
    FROM member
   GROUP BY zone
) a

出力例:

| | GROUP_TYPE | 詳細 |
-------------------------------------------------- -------------------------------------------------- -------------------
| | クラブ | A;email1@example.com,email2@example.com|B;email3@example.com|C;email4@example.com|D;email5@example.com |
| | 地域 | 1;email1@example.com,email2@example.com,email3@example.com,email4@example.com|2;email5@example.com |
| | ゾーン | 1;email1@example.com,email2@example.com,email3@example.com,email5@example.com|2;email4@example.com |

これがSQLFiddleのデモです

クライアント側でphpを使用している場合は、結果セットを繰り返し処理しているときに、details列を個別のレコードに簡単に巻き戻すことができます。explode()

于 2013-08-07T21:17:15.183 に答える