Объединение строк MYSQL, суммирование некоторых столбцов, обновление идентификаторов в другой таблице - PullRequest
1 голос
/ 29 мая 2019

У меня есть база данных MySQL с несколькими таблицами, две из которых выглядят так:

игроков

+-----+---------+-------------------+----------------+----------------+--------------+---------------------+
| id  | base_id |       name        | total_searches | auctions_found | auctions_won |     created_at      |
+-----+---------+-------------------+----------------+----------------+--------------+---------------------+
| 283 |  177683 | Christian Eriksen |             12 |              2 |            1 | 2019-05-29 11:25:08 |
| 160 |  177683 | Christian Eriksen |             24 |              4 |            1 | 2019-05-29 11:25:08 |
|  76 |  345345 | Yan Sommer        |             12 |              1 |            3 | 2019-05-29 11:25:08 |
| 712 |    4353 | Yannick Carrasco  |             42 |              5 |           12 | 2019-05-29 11:25:08 |
+-----+---------+-------------------+----------------+----------------+--------------+---------------------+

транзакций

+----+-----------+---------------------+
| id | player_id |     updated_at      |
+----+-----------+---------------------+
|  1 |       283 | 2019-05-29 11:25:08 |
|  2 |       160 | 2019-05-29 11:25:08 |
|  3 |        76 | 2019-05-29 11:25:08 |
+----+-----------+---------------------+

Как видите, в таблице игроков есть дубликаты (Кристиан Эриксен).Я хотел бы объединить эти строки, составив столбцы total_searches, auctions_found и auctions_won.В этой таблице есть несколько других столбцов (некоторые здесь опущены для краткости), которые либо совпадают (например, base_id), либо не очень важно, какое значение сохраняется (например, created_at).

Что важно, так это id.Либо должен быть создан новый id, либо, в идеале, один из существующих id.Таблицу транзакций затем нужно будет обновить новыми player_id.

+-----+---------+-------------------+----------------+----------------+--------------+---------------------+
| id  | base_id |       name        | total_searches | auctions_found | auctions_won |     created_at      |
+-----+---------+-------------------+----------------+----------------+--------------+---------------------+
| 160 |  177683 | Christian Eriksen |             36 |              6 |            2 | 2019-05-29 11:25:08 |
|  76 |  345345 | Yan Sommer        |             12 |              1 |            3 | 2019-05-29 11:25:08 |
| 712 |    4353 | Yannick Carrasco  |             42 |              5 |           12 | 2019-05-29 11:25:08 |
+-----+---------+-------------------+----------------+----------------+--------------+---------------------+

+----+-----------+---------------------+
| id | player_id |     updated_at      |
+----+-----------+---------------------+
|  1 |       160 | 2019-05-29 11:25:08 |
|  2 |       160 | 2019-05-29 11:25:08 |
|  3 |        76 | 2019-05-29 11:25:08 |
+----+-----------+---------------------+

. У меня нет знаний по SQL, поэтому я еще ничего не пробовал.Некоторые советы или в идеале полное решение будет приветствоваться.

1 Ответ

2 голосов
/ 29 мая 2019

Это довольно сложно.Я бы посоветовал:

  • Резервное копирование таблиц!
  • Обновите идентификатор в таблице транзакций, чтобы он стал максимальным идентификатором.
  • Исправьте таблицу игроков.
  • Исправьте модель данных.

То есть:

update transactions t join
       players p
       on t.player_id = p.id join
       (select p2.name, max(p2.id) as max_id
        from players p2
        group by p2.name
        having count(*) > 1
       ) p2
       on p2.name = p.name  -- or should this be "base_id"
    set t.player_id = p2.max_id
    where t.player_id <> p2.max_id;

Затем, чтобы обновить таблицу, я рекомендую очистить ее и создать заново:

create table players_temp as
    select max(id) as id,  base_id, name,
           sum(total_searches) as total_searches, 
           sum(auctions_found) as auctions_found,
           sum(auctions_won) as auctions_won,
           min(created_at) as created_at  
    from players
    group by base_id, name;  -- or whatever

truncate table players;

insert into players (id, base_id, name, total_searches, auctions_found, auctions_won, created_at)
    select id, base_id, name, total_searches, auctions_found, auctions_won, created_at
    from players_temp;

Затем исправьте модель данных:

alter table players add constraint unq_players_name
    unique (name);

alter table players add constraint unq_players_base_id
    unique (base_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...