【问题标题】:Grouped Index in MySQLMySQL中的分组索引
【发布时间】:2020-02-21 23:38:22
【问题描述】:

我正在 MySQL 中构建一个表,需要构建一个递增的“分组索引”行,但会为另一列中的新值重置。像这样:

1 Apple
2 Apple
3 Apple
1 Banana
2 Banana
1 Pear
2 Pear
3 Pear
4 Pear

有什么想法可以做到这一点吗?

【问题讨论】:

  • 如果有两组“Apple”会发生什么。

标签: mysql sql database indexing window-functions


【解决方案1】:

如果您运行的是 MySQL 8.0,只需使用row_number()

select
    row_number() over(partition by fruit order by ?) rn,
    fruit
from mytable

请注意,为了让您的答案产生一致的结果,您需要另一个可用于排序记录的列。我在查询中将其表示为?

【讨论】:

    【解决方案2】:

    如果你使用 mysql 5.x 你可以使用这个查询

    CREATE TABLE fruit (
    
      `fruit` VARCHAR(6)
    );
    
    INSERT INTO fruit
      ( `fruit`)
    VALUES
      ( 'Apple'),
      ( 'Apple'),
      ( 'Apple'),
      ( 'Banana'),
      ( 'Banana'),
      ( 'Pear'),
      ( 'Pear'),
      ( 'Pear'),
      ( 'Pear');
    
    ✓ ✓
    SELECT
    IF(fruit = @fruit, @row_number := @row_number +1,@row_number := 1) rownumber
    ,@fruit := fruit
    FROM
      (SELECT * From fruit ORDER BY fruit ASC) t, (SELECT @row_number := 0) a,(SELECT @fruit := '') b ;
    
    行号 | @fruit := 水果 --------: | :-------------- 1 |苹果 2 |苹果 3 |苹果 1 |香蕉 2 |香蕉 1 |梨 2 |梨 3 |梨 4 |梨

    db小提琴here

    顺序必须这样,算法才能工作。如果需要在 mysql 中更改,请使用外部 SELECT

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-04
      • 2013-02-23
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 2011-08-01
      相关资源
      最近更新 更多