Visual Studio .NET 2002Visual C++ 7.1Visual C++ 7.0DBAWindows 2000Windows XPMySQL中级开发Visual StudioSQL ServerSQLWindowsC++
MyGroupConcat:用于字符串连接的 MySQL UDF 聚合函数






3.47/5 (11投票s)
2003年6月23日
3分钟阅读

89194

680
这个 MySQL 扩展库提供了一个用于字符串连接的聚合函数(用于 SELECT...GROUP BY 子句)。
概述
这个 MySQL 扩展库提供了一个 用于字符串连接的聚合函数(用于 SELECT...GROUP BY 子句)。
组件特性
这个组件- 实现了一个用于字符串连接的聚合函数
- 提供非常小的可执行文件:9 KB
- 在 Windows XP 和 Windows 2000 Server 上运行
- 使用 VC++ 7.0 (Visual Studio .NET) 编译
- 可以作为用户定义函数 (UDF) group_concat() 插入 MySQL 中
用法
从 MySQL 使用这个组件
- 创建函数
group_concat
CREATE AGGREGATE FUNCTION group_concat RETURNS STRING SONAME "MyGroupConcat.dll";
- 直接从 SQL 调用方法 group_concat()
SELECT group_concat(first_name, ' ')
FROM users
GROUP BY id
;
示例代码 (SQL)
创建测试数据
要创建并填充测试表 test_group_concat
,请使用以下 SQL 脚本
DROP TABLE IF EXISTS test_group_concat
;
CREATE TABLE test_group_concat(
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(8),
label VARCHAR(255)
)
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'A01', '0LINE 1 LABEL')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'A011', 'LINE 2 LABEL')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'A0111', 'LINE 3 LABEL')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'A02', '0LINE 1 LABEL 2')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'A021', 'LINE 2 LABEL 2')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B01', '0LINE 1 LABEL 3')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B011', 'LINE 2 LABEL 3')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0111', 'LINE 3 LABEL 3')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0111', 'LINE 4 LABEL 3')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0111', 'LINE 5 LABEL 3')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0111', 'LINE 6 LABEL 3')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B02', '0LINE 1 LABEL 4 (nulls)')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B021', NULL)
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0211', NULL)
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0211', 'LINE 3 LABEL 4 (nulls)')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0211', 'LINE 5 LABEL 4 (nulls)')
;
INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0211', 'LINE 6 LABEL 4 (nulls)')
;
SELECT * FROM test_group_concat
;
您将获得以下输出:
id | code | label |
---|---|---|
1 | A01 | 0行 1 标签 |
2 | A011 | 行 2 标签 |
3 | A0111 | 行 3 标签 |
4 | A02 | 0行 1 标签 2 |
5 | A021 | 行 2 标签 2 |
6 | B01 | 0行 1 标签 3 |
7 | B011 | 行 2 标签 3 |
8 | B0111 | 行 3 标签 3 |
9 | B0111 | 行 4 标签 3 |
10 | B0111 | 行 5 标签 3 |
11 | B0111 | 行 6 标签 3 |
12 | B02 | 0行 1 标签 4 (nulls) |
13 | B021 | |
14 | B0211 | |
15 | B0211 | 行 3 标签 4 (nulls) |
16 | B0211 | 行 5 标签 4 (nulls) |
17 | B0211 | 行 6 标签 4 (nulls) |
仅显示 group_concat() 的输出
SELECT
group_concat(label) AS label
FROM
test_group_concat
GROUP BY
LEFT(code, 3)
;
您将获得以下输出:
label |
---|
0行 1 标签行 2 标签行 3 标签 |
0行 1 标签 2行 2 标签 2 |
0行 1 标签 3行 2 标签 3行 3 标签 3行 4 标签 3行 5 标签 3行 6 标签 3 |
0行 1 标签 4 (nulls)行 3 标签 4 (nulls)行 5 标签 4 (nulls)行 6 标签 4 (nulls) |
显示 group_concat() 和 GROUP BY 子句的值
您可以连接代码以相同 3 个字母开头的字段(例如,标签)
SELECT
LEFT(code, 3) AS code, group_concat(label) AS label
FROM
test_group_concat
GROUP BY
LEFT(code, 3)
;
您将获得以下输出:
code | label |
---|---|
A01 | 0行 1 标签行 2 标签行 3 标签 |
A02 | 0行 1 标签 2行 2 标签 2 |
B01 | 0行 1 标签 3行 2 标签 3行 3 标签 3行 4 标签 3行 5 标签 3行 6 标签 3 |
B02 | 0行 1 标签 4 (nulls)行 3 标签 4 (nulls)行 5 标签 4 (nulls)行 6 标签 4 (nulls) |
显示 group_concat()、GROUP BY 子句的值,并使用分隔符
您还可以在连接过程中使用特定的分隔符(例如,下面的空格),就像 MySQL 的 CONCAT_WS 函数一样
SELECT
LEFT(code, 3) AS code, group_concat(label, ' ') AS label
FROM
test_group_concat
GROUP BY
LEFT(code, 3)
;
在这种情况下,对于找到的每个字段值,分隔符都会被连接(除非字段值为 NULL,例如代码 'B02')
code | label |
---|---|
A01 | 0行 1 标签 行 2 标签 行 3 标签 |
A02 | 0行 1 标签 2 行 2 标签 2 |
B01 | 0行 1 标签 3 行 2 标签 3 行 3 标签 3 行 4 标签 3 行 5 标签 3 行 6 标签 3 |
B02 | 0行 1 标签 4 (nulls) 行 3 标签 4 (nulls) 行 5 标签 4 (nulls) 行 6 标签 4 (nulls) |
实现
- 实现基于 MySQL 示例代码(源代码发布)
待办事项
- 提供其他字符串函数的聚合版本?