2

我有一个表成员,其中member_id, member_name, club_name, region, 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 回答