我在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
答案 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。