mysql group_concat group by on multiple fields

时间:2013-08-07 21:04:13

标签: mysql group-concat

我有一个包含member_idmember_nameclub_nameregionzoneemail作为字段的表成员。

我正在使用MySQL group_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个区域,每个区域都有多个区域。现在,我如何获得可以分组或与地区,区域或俱乐部相关的电子邮件?

1 个答案:

答案 0 :(得分:8)

很难从你的问题中完全理解你是什么,但你可以尝试

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

示例输出:

| CLUB_NAME |                                EMAILS |          MEMBERS |
------------------------------------------------------------------------
|     Club1 | m1@mail.com, m2@mail.com, m3@mail.com | Jhon, Mark, Beth |
|     Club2 |              m4@mail.com, m5@mail.com |    Helen, Thomas |

这是 SQLFiddle 演示

旁注: 在这样的问题中提供样本数据和所需的输出通常会改善您更快地获得答案并最符合您需求的更改。 < / p>

更新:如果符合您的要求,您可以使用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 |                                                                                                DETAILS |
-----------------------------------------------------------------------------------------------------------------------
|       club | A;email1@example.com,email2@example.com|B;email3@example.com|C;email4@example.com|D;email5@example.com |
|     region |     1;email1@example.com,email2@example.com,email3@example.com,email4@example.com|2;email5@example.com |
|       zone |     1;email1@example.com,email2@example.com,email3@example.com,email5@example.com|2;email4@example.com |

这是 SQLFiddle 演示

如果您在客户端使用php,则可以在迭代结果集时使用details轻松地将explode()列展开到单独的记录中。