【问题标题】: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
有什么想法可以做到这一点吗?
【问题讨论】:
标签:
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