Идентифицировать повторяющиеся значения в пределах каждого l oop и присваивать возрастающее число каждому дублирующему значению - PullRequest
1 голос
/ 20 марта 2020

Вот моя MySQl таблица

Id    Name   Value
1    abc     12
2    xyz     32
3    abc     43
4    cde     54
5    fgh     75
6    abc     56
7    fgh     98

Я хочу добавить увеличивающееся число к каждому дублирующему значению, когда оно было напечатано с использованием foreach l oop, как показано ниже.

abc (1) = 12
abc (2) = 43
abc (3) = 56
cde = 43
fgh (1) = 75
fgh (2) = 98
xyz = 32

Можно ли этого добиться?

Ответы [ 2 ]

1 голос
/ 20 марта 2020
    //your db rows
    $rows = [
        ['id' => 1, 'name' => 'abc', 'value' => 12],
        ['id' => 2, 'name' => 'xyz', 'value' =>32],
        ['id' => 3, 'name' => 'abc', 'value' =>43],
        ['id' => 4, 'name' => 'cde', 'value' =>54],
        ['id' => 5, 'name' => 'fgh', 'value' =>75],
        ['id' => 6, 'name' => 'abc', 'value' =>56],
        ['id' => 7, 'name' => 'fgh', 'value' =>98],
    ];

    $data = [];
    ///select same names to array
    foreach ($rows as $row){
        if(array_key_exists($row['name'], $data)){
            array_push($data[$row['name']], $row['value']);
        }else{
            $data[$row['name']] = [$row['value']];
        }
    }

    //output result
    foreach ($data as $key => $value){
        if(count($data[$key]) === 1){
            echo $key .' = '. $value[0];
            echo '<br>';
        }else{
            foreach ($value as $k => $v){
                $k++;
                echo $key .'('.$k.') = '. $v;
                echo '<br>';
            }
        }
    }

    output
    abc(0) = 12
    abc(1) = 43
    abc(2) = 56
    xyz = 32
    cde = 54
    fgh(0) = 75
    fgh(1) = 98
1 голос
/ 20 марта 2020

В MySQL 8.0 используйте row_number():

select t.*, row_number() over(partition by name order by id) rn
from mytable t

Если вы действительно хотите изменить имя, добавив префикс приращения при наличии дубликатов:

select 
    case when count(*) over(partition by name) > 1 
        then concat(name, ' (', row_number() over(partition by name order by id), ')')
        else name
    end name,
    value
from mytable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...