【问题标题】:How could I pass the separator as a variable in MySQL GROUP_CONCAT?如何在 MySQL GROUP_CONCAT 中将分隔符作为变量传递?
【发布时间】:2019-04-21 10:17:25
【问题描述】:

我想将GROUP_CONTACTSEPARATOR 值作为变量(或函数参数)传递,但是此代码将失败

SET @sep = ' ';
SELECT
    `group`,
    GROUP_CONCAT( `field` ORDER BY `idx` SEPARATOR @sep ) `fields`
FROM `table`
GROUP BY `group`;

我知道我可以做类似的事情

SELECT
    `group`,
    SUBSTRING(
      GROUP_CONCAT( CONCAT(`field`,@sep) ORDER BY `idx` SEPARATOR ''),
      1,
      LENGTH(
        GROUP_CONCAT( CONCAT(`field`,@sep) ORDER BY `idx` SEPARATOR '')
      )-LENGTH(@sep)
    ) `fields`
FROM `table`
GROUP BY `group`;

但最好有更简洁的语法。


编辑:

SELECT
    `group`,
    SUBSTRING(
      GROUP_CONCAT( CONCAT(@sep,`field`) ORDER BY `idx` SEPARATOR ''),
      LENGTH(@sep)+1
    ) `fields`
FROM `table`
GROUP BY `group`;

稍微简单一点,但不够满意。

【问题讨论】:

  • “要明确指定分隔符,请使用 SEPARATOR 后跟应插入组值之间的字符串文字值”。只接受字符串文字,不接受变量。参考:dev.mysql.com/doc/refman/8.0/en/…
  • 为什么LENGTH(@sep)+1group_concat() 的第二个参数?整数在那个位置有什么相关性? Stackoverflow 不是功能愿望清单的地方。
  • 我投票结束这个问题,因为它似乎是一个功能愿望
  • @Used_By_Already LENGTH(@sep)+1SUBSTRING 的第二个参数
  • @Used_By_Already,要求两种解决方法解释为什么只允许使用文字背后的基本原理。我认为公众可以从这个问题和答案中受益。

标签: mysql group-concat


【解决方案1】:

您可以使用准备好的语句:

SET @sep = '**';
SET @sql = CONCAT('SELECT `group`, GROUP_CONCAT( `field` ORDER BY `idx` SEPARATOR "',
@sep, '") `fields` FROM `table` GROUP BY `group`');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

我在dbfiddle上创建了一个小演示:

create table `table` (idx int auto_increment primary key, field varchar(10), `group` int);
insert into `table` (field, `group`) values
('hello', 4),
('world', 4),('today', 4),('hello', 3),('world', 3),
('hello', 5),('today', 5),('world', 5),('goodbye', 5)

准备好的语句的输出是:

group   fields
3       hello**world
4       hello**world**today
5       hello**today**world**goodbye

【讨论】:

    猜你喜欢
    • 2014-03-07
    • 2011-12-03
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多