gpt4 book ai didi

php - MySQL Remove/Combine Similar Rows 及其引用

转载 作者:可可西里 更新时间:2023-11-01 08:39:22 25 4
gpt4 key购买 nike

我有 2 个表:Tags 和 Post_Tags_relationship

标签表有 3 列 - ID(主要)、标题和 URLPost_Tags_relationship 表 有 2 列 - Tag_ID 和 Post_ID(主要是两者的组合)

Tags表中有很多相似的tag title和url,我想删除所有重复的记录,同时修改Post_Tags_relationship,将删除的tag id更新为已有的,如果这样更新会返回duplicate id错误然后将其删除。

所以如果标签表有:

ID= 20, Title = News Section, URL = news-section
ID= 68, Title = News Section, URL = news-section

Post_Tags_relationship 有:

Post_ID = 56, Tag_ID = 20
Post_ID = 80, Tag_ID = 20
Post_ID = 500, Tag_ID = 68
Post_ID = 584, Tag_ID = 20
Post_ID = 695, Tag_ID = 20
Post_ID = 695, Tag_ID = 68```

如果我们从 Tags 表中删除 ID 20,Post_Tags_relationship 将如下所示:

Post_ID = 56, Tag_ID = 68
Post_ID = 80, Tag_ID = 68
Post_ID = 500, Tag_ID = 68
Post_ID = 584, Tag_ID = 68
Post_ID = 695, Tag_ID = 68 // deplicate Primary key I want this to be removed please.
Post_ID = 695, Tag_ID = 68 // ```

我希望这是有道理的,如果您有任何问题,请告诉我。

最佳答案

查找标签重复项并将它们存储在“临时”表中:

drop table if exists tmp_tags_duplicates;
create table tmp_tags_duplicates
select t1.id, min(t0.id) as duplicate_of
from tags t1
join tags t0 using(title, url)
where t1.id > t0.id
group by t1.id;

posts_tags 表中找到已经插入的重复项(需要删除)。将它们存储在另一个“临时”表中:

drop table if exists tmp_to_delete;
create table tmp_to_delete
select pt1.*, d.duplicate_of
from posts_tags pt1
join tmp_tags_duplicates d on d.id = pt1.tag_id
join posts_tags pt0
on pt0.post_id = pt1.post_id
and pt0.tag_id = d.duplicate_of;

posts_tags 中找到需要更新的条目。将它们存储在第三个“临时”表中:

drop table if exists tmp_to_update;
create table tmp_to_update
select pt1.*, d.duplicate_of
from posts_tags pt1
join tmp_tags_duplicates d on d.id = pt1.tag_id
left join posts_tags pt0
on pt0.post_id = pt1.post_id
and pt0.tag_id = d.duplicate_of
where pt0.tag_id is null;

删除 posts_tags 中的重复项:

delete pt
from posts_tags pt
join tmp_to_delete t using(post_id, tag_id);

更新 posts_tags 中的 tag_id:

update posts_tags pt
join tmp_to_update t using(post_id, tag_id)
set pt.tag_id = t.duplicate_of;

删除标签表中的重复项

delete t
from tags t
join tmp_tags_duplicates using(id);

删除“临时”表。

drop table tmp_tags_duplicates;
drop table tmp_to_delete;
drop table tmp_to_update;

演示:http://rextester.com/FUWZG89399

现在定义正确的 UNIQUE 和 FOREIGN 键,这样您就不需要再修复它了。

关于php - MySQL Remove/Combine Similar Rows 及其引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42332830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com