繁体   English   中英

在MySQL中聚合函数GROUP_CONCAT(expr)

[英]Aggregate function GROUP_CONCAT(expr) in MySQL

我在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

我尝试了聚合查询来获取此输出,因为您所在的areaDM所以在所有地区都应出现名称raf

+------+------------------------------+
| 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

您需要使用LIKE比较将数据基于直接选择的并集与自身的LIKE以收集所有“匹配”的名称:

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

我将使用此解决方案,该解决方案利用了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

第一个子查询返回长度大于2的所有AREAS,例如DM4,DMS,DM7。 然后,当长度大于2时,将这个子查询加入到您的表上areas.area=tbl_names.area ,或者当区域的长度为2时使用LIKE。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM