MySQL - 一种将所有找到的行加入一列的方法

Posted

技术标签:

【中文标题】MySQL - 一种将所有找到的行加入一列的方法【英文标题】:MySQL - A way to join all found rows in one column 【发布时间】:2011-01-14 07:18:34 【问题描述】:

创建表dummy ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR( 30 ) 非空 ) 引擎 = MYISAM ;

并运行此查询:

SELECT GROUP_CONCAT(`name` SEPARATOR "||") FROM `dummy`

此查询将所有行中的名称列与 || 连接起来。在单个列中。但是,结果被 mysql 配置截断,如mysql manual 中所述:

"... 结果被截断为 group_concat_max_len 系统变量给出的最大长度,默认值为 1024 ..."

在手册中还说可以在运行时通过以下语法更改此设置:

SET [GLOBAL | SESSION] group_concat_max_len = val;

更改此配置是否适用于所有 mysql 服务器环境?如果没有,如果没有 GROUP_CONCAT 没有限制,我怎样才能达到相同的结果?

另外,我认为更改配置不会解决我的问题,因为我不知道如何设置 group_concat_max_len 的值,因为虚拟表中的行数可以是任意数字。

谢谢。

【问题讨论】:

您是否有理由必须在 MySQL 中而不是在某些编程语言中这样做? 我不确定group_concat_max_len 设置的行为方式。但是,您(实际上)需要将其设置为无穷大以使您的查询正常工作,这是一个问题:您应该尝试在不使用组 concat 的情况下达到相同的结果 Tatu - 如果我有 300,000 行,循环遍历所有行并加入不会像原生 MySQL 那样快 Martijn - 是的,你是完全正确的,但是怎么样?? 大图是对的。执行 SELECT id, name FROM dummy 并循环遍历结果就是它的完成方式。这就是应该使用数据库的方式。您可以在编程语言中使用存储过程或使用 for 循环。正如您所说,编程语言可能较慢,但您确实需要访问代码中的数据,不是吗? 【参考方案1】:

您是否尝试过使用存储过程来完成您的任务?您可以创建一个具有单行/列的临时表,并在从表中获取行时附加到它。最后只是 SELECT 临时表中的单个值。 您可以在mysql manual 和其他地方找到有关存储例程的信息。

【讨论】:

嗨,尤金,由于版本要求,我不能使用存储过程

以上是关于MySQL - 一种将所有找到的行加入一列的方法的主要内容,如果未能解决你的问题,请参考以下文章

将python字典写入CSV列:第一列的键,第二列的值

SQL:根据另一列的值在列上保留一个具有最大值的行

怎样取得DataTable某行某列的值

Excel2007怎么选中一列中除了第一行之外的下面所有的行?

查询以返回在所有行中对于一列的每个不同值具有相同值的行值

保留数据框中的行,对于某些列的值的所有组合,在另一列中包含相同的元素