У меня есть база данных 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, поэтому я еще ничего не пробовал. Некоторые указатели или, в идеале, полное решение будут оценены.
Это довольно сложно. Я бы предложил:
То есть:
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);