【问题标题】:MySQL GROUP_CONCAT Assign incrementing valueMySQL GROUP_CONCAT 分配递增值
【发布时间】:2013-07-18 12:08:27
【问题描述】:

我需要为结果中的每一行从 0 开始的串联行中的每个字符串分配一个递增值。

这是一个简化的数据示例:

number|color
1     |red
1     |blue
1     |orange
2     |brown
3     |purple
3     |yellow

这是我需要的结果:

number|color_set
1     |0 red,1 blue,2 orange
2     |0 brown
3     |0 purple,1 yellow

这是我得到的结果:

number|color_set
1     |0 red,1 blue,2 orange
2     |3 brown
3     |4 purple,5 yellow

这是我一直在尝试的:

SET @x:=0;

SELECT number, GROUP_CONCAT(@x:=@x+1,' ',color SEPARATOR ',')
FROM table
GROUP BY number;

需要将每个结果行的变量重置为 0。我显然不是专家,而且我是该网站的新手,因此非常感谢任何帮助。

谢谢,

【问题讨论】:

  • 你为什么要这样做?你最终想要达到什么目标?
  • 同意@Strawberry。在应用层执行分组通常比以这种方式使用GROUP_CONCAT() 更好。
  • 问题是,mysql 中没有“自然顺序”,所以没有理由红色应该是 0 而不是 1
  • 我必须将这些结果与一堆其他代码连接起来,这样我才能在我拥有但不是设计的 Magento 电子商务网站上填充优惠券表。我不是开发人员,但我知道一点 SQL/MySQL,所以请多多包涵。现在,我在该表中有 5984 条记录,这会减慢购物车流程。我已将折扣金额四舍五入为 393 个唯一值,每个值包含 1 到 67 个不同的产品代码。该网站要求每个产品代码前面都有一个从零开始并以 1 为增量递增的数值。

标签: mysql group-concat


【解决方案1】:

两步解决方案怎么样?还是只能是 1 个 SQL 查询?

  1. 用(id, color)创建一个临时表,将id声明为自增,设置自增的开始为0 (ALTER TABLE tbl AUTO_INCREMENT = 0;)
  2. 选择并插入要转换的任何记录 (INSERT INTO ttTable SELECT color FROM datatable WHERE number = 3),然后将它们读回并通过 GROUP_CONCAT 生成列表。您必须对原始表格中的所有数字重复此步骤。

【讨论】:

  • 您好,感谢您的回复。我需要将此添加到现有查询中,因此它需要是 1 个 SQL 查询。谢谢,杰
【解决方案2】:

只是为了好玩......

 CREATE TABLE colors(color_set INT NOT NULL,color VARCHAR(12) NOT NULL,PRIMARY KEY (color_set,color));

 INSERT INTO colors VALUES
 (1     ,'red'),
 (1     ,'blue'),
 (1     ,'orange'),
 (2     ,'brown'),
 (3     ,'purple'),
 (3     ,'yellow');


      SELECT color_set
      , GROUP_CONCAT(CONCAT_WS(' ',n,color) ORDER BY n) array
   FROM
      ( SELECT c.*
             , FIND_IN_SET(color,x)-1 n 
          FROM colors c
          JOIN 
             ( SELECT color_set
                    , GROUP_CONCAT(color ORDER BY LENGTH(color),color) x 
                 FROM colors 
                GROUP 
                   BY color_set
             ) y
            ON y.color_set = c.color_set
      ) z
  GROUP 
     BY color_set;

 +-----------+-----------------------+
 | color_set | array                 |
 +-----------+-----------------------+
 |         1 | 0 red,1 blue,2 orange |
 |         2 | 0 brown               |
 |         3 | 0 purple,1 yellow     |
 +-----------+-----------------------+

【讨论】:

  • 您好,感谢您的回复。这很完美。谢谢,杰
【解决方案3】:

也只是为了好玩……

SELECT
number,
GROUP_CONCAT(CONCAT(counter, ' ', color)) 
FROM (
SELECT
number,
color,
@counter := CASE WHEN @prev = number THEN @counter + 1 ELSE 0 END AS counter,
@prev := number
FROM
yourTable yt
, (SELECT @counter:=0, @prev:=NULL) vars
) sq
GROUP BY number
  • sqlfiddle 中实时查看它的工作情况

【讨论】:

  • 您好,感谢您的回复。这没有给出预期的结果。这些值不是从零开始的并且是非连续的。谢谢,杰
  • 然后将 1 更改为 0,就像在我编辑的答案中一样。除此之外,它与草莓的相同。对不起,我给你留下了一点想法。
【解决方案4】:

我知道这已经得到解答,但这不是更简单的方法吗?只需将@x:=0 添加到选择中?

SET @x:=0;

SELECT 数字, GROUP_CONCAT(@x:=@x+1,' ',color SEPARATOR ','),@x:=0 从表 按数字分组;

【讨论】:

  • 谢谢哥们。这是非常有用且最短的解决方案:)
猜你喜欢
  • 2023-03-26
  • 2012-07-14
  • 2016-10-16
  • 1970-01-01
  • 2012-08-29
  • 2017-07-05
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
相关资源
最近更新 更多