MySQL中的聚合函数组_CONCAT(expr)

MySQL中的聚合函数组_CONCAT(expr),mysql,aggregate-functions,Mysql,Aggregate Functions,我在MySQL数据库中使用聚合函数GROUP\u CONCAT(expr)时遇到问题: 我有一张有以下行的桌子: +------+------+ | NAME | AREA | +------+------+ | and | DM4 | | ant | DMS | | don | DM7 | | ett | DM4 | | fab | DM4 | | fra | DMS | | gia | DM7 | | gug | DM2 | | raf | DM |

我在MySQL数据库中使用聚合函数GROUP\u CONCAT(expr)时遇到问题:

我有一张有以下行的桌子:

+------+------+
| 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
应该出现在所有区域中,因为您的
区域
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

您需要将数据建立在直接选择的并集上,并使用
LIKE
比较来收集所有“匹配”的名称:


请参见

我将使用此解决方案,它利用连接:

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的区域,如DM4、DMS、DM7。然后,当长度大于2时,我将此子查询连接回您在
areas.area=tbl\u names.area上的表,或者在区域长度为2时使用类似的查询。

我认为输出正确,为什么您会期望不同的结果?如果您按区域分组,mysql将仅连接具有相同区域的名称,那么在您的预期结果中会缺少类似于
DM
的区域。我尝试聚合查询以获取所有区域中名称raf应该出现的输出,因为您的区域是DM;现在raf这个名字并不存在于所有的领域,显然你想让“DM”成为所有DM的某种通配符?价值观但事实并非如此DM'!='DM4’因此,当分组时,它会得到自己的行。这似乎是一个逻辑上的问题:您按区域分组,该区域在分组时会考虑每个字母。但你想要的是,以DM开始的领域也应该被考虑在内。这不在集团声明中。所以你必须选择另一种方法。此外,在您的应为输出中,DM结果行丢失,因此您的应为列表从一开始就是错误的。重新思考您真正需要的输出@安东尼娅,你会拉小提琴吗?
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