MySQL中的聚合函数组_CONCAT(expr)
我在MySQL数据库中使用聚合函数GROUP\u 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 |
+------+------+
| 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