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 - 一种将所有找到的行加入一列的方法的主要内容,如果未能解决你的问题,请参考以下文章