Сгруппированный индекс в MySQL - PullRequest
0 голосов
/ 22 февраля 2020

Я строю таблицу в MySQL, и мне нужно построить строку «сгруппированный индекс», которая увеличивается, но сбрасывается для новых значений в другом столбце. Вот так:

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

Есть идеи, как мне это сделать?

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Если вы используете 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 ;
rownumber | @fruit := fruit
--------: | :--------------
        1 | Apple          
        2 | Apple          
        3 | Apple          
        1 | Banana         
        2 | Banana         
        1 | Pear           
        2 | Pear           
        3 | Pear           
        4 | Pear           

db <> fiddle здесь

Порядок столбцов должен быть таким, чтобы алгоритм может работать . Если вам нужно изменить значение в mysql, используйте внешний SELECT

1 голос
/ 22 февраля 2020

Если вы используете MySQL 8.0, просто используйте row_number():

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

Обратите внимание, что для ответа, чтобы получить согласованные результаты, вам нужен еще один столбец, который может использоваться для заказа записей. Я представлял это как ? в запросе.

...