MySQL中的分组索引

Posted

技术标签:

【中文标题】MySQL中的分组索引【英文标题】:Grouped Index in MySQL 【发布时间】: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”会发生什么。 【参考方案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

【讨论】:

以上是关于MySQL中的分组索引的主要内容,如果未能解决你的问题,请参考以下文章

联合分组子查询视图事务python操作mysql索引

分组依据/排序依据的 MySQL 索引

MySQL中的索引简介

MySQL:与案例一起使用时按子句分组不使用索引

MySQL按查询分组,多个总和不使用索引,滞后于使用文件排序

MySQL核心面试技术(持续更新)