MySQL中的聚合函数GROUP_CONCAT(expr)

时间:2014-09-09 08:06:17

标签: mysql aggregate-functions

我在MySQL数据库中使用聚合函数 GROUP_CONCAT(expr)时遇到问题: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

我有这个行的表:

+------+------+
| NAME | AREA |
+------+------+
| and  | DM4  |
| ant  | DMS  |
| don  | DM7  |
| ett  | DM4  |
| fab  | DM4  |
| fra  | DMS  |
| gia  | DM7  |
| gug  | DM2  |
| raf  | DM   |
| rob  | DM2  |
| vin  | DM7  |
+------+------+
16 rows in set

我尝试使用汇总查询来获取此输出,其中 raf 名称应该出现在所有区域中,因为 area DM

+------+------------------------------+
| AREA | group_emails                 |
+------+------------------------------+
| DM4  | and; ant; ett; fab; fra; raf |
| DM6  | and; ant; raf                |
| DM7  | and; don; gia; vin; raf      |
| DM2  | gug; rob; raf                |
| DMS  | ant; fra ; raf               |
+------+------------------------------+

我测试了这个解决方案,但输出错误。

这开始让我相信我的整体结构是不正确的。

我错过了什么?

我非常感谢您在解决这个问题时能给我的任何帮助。

mysql> SELECT
    AREA,
    GROUP_CONCAT(
        DISTINCT NAME
        ORDER BY
            NAME ASC SEPARATOR '; '
    ) AS group_emails
FROM
    `tbl_NAMES`
GROUP BY
        AREA
ORDER BY
    NAME ASC;
+------+-------------------------+
| AREA | group_emails            |
+------+-------------------------+
| DM4  | and; ant; ett; fab; fra |
| DM   | raf                     |
| DM6  | and; ant                |
| DM7  | and; don; gia; vin      |
| DM2  | gug; rob                |
| DMS  | ant; fra                |
+------+-------------------------+
6 rows in set

2 个答案:

答案 0 :(得分:1)

您需要使用LIKE比较将数据建立在直接选择和自身联接的联合上,以收集所有与#34;匹配的名称

SELECT
    AREA,
    GROUP_CONCAT(
        DISTINCT NAME
        ORDER BY NAME
        SEPARATOR '; ') AS group_emails
FROM (
SELECT * FROM tbl_NAMES
UNION
SELECT t2.name, t1.AREA
FROM tbl_NAMES t1
LEFT JOIN tbl_NAMES t2
  ON t1.AREA like concat(t2.AREA, '%')
) x
GROUP BY AREA
ORDER BY group_emails

请参阅SQLFiddle

答案 1 :(得分:0)

我会使用这个使用JOIN的解决方案:

SELECT areas.area, GROUP_CONCAT(name ORDER BY name ASC SEPARATOR '; ') AS group_emails
FROM
  (SELECT DISTINCT area
   FROM tbl_names
   WHERE
     CHAR_LENGTH(area)>2) areas
  INNER JOIN tbl_names
  ON areas.area=tbl_names.area OR (CHAR_LENGTH(tbl_names.area)=2 AND areas.area LIKE CONCAT(tbl_names.area, '%'))
GROUP BY areas.area
ORDER BY areas.area

第一个子查询返回长度为>的所有AREAS。 2像DM4,DMS,DM7。我会在areas.area=tbl_names.area上将此子查询返回到您的表格,当长度为> 2时,或者当该区域的长度为2时使用LIKE。