草庐IT

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

coder 2023-10-24 原文

我有 2 个表:Tags 和 Post_Tags_relationship

标签表有 3 列 - ID(主要)、标题和 URL Post_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/

有关php - MySQL Remove/Combine Similar Rows 及其引用的更多相关文章

  1. ruby - 一个 YAML 对象可以引用另一个吗? - 2

    我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

  2. ruby - Chef LW 资源属性默认值如何引用另一个属性? - 2

    我正在尝试将一个资源属性的默认值设置为另一个属性的值。我正在为我正在构建的tomcat说明书定义一个资源,其中包含以下定义。我想要可以独立设置的“名称”和“服务名称”属性。当未设置服务名称时,我希望它默认为为“名称”提供的任何内容。以下不符合我的预期:attribute:name,:kind_of=>String,:required=>true,:name_attribute=>trueattribute:service_name,:kind_of=>String,:default=>:name注意第二行末尾的“:default=>:name”。当我在Recipe的新block中引用我

  3. ruby - 在 Ruby 中,为什么 Array.new(size, object) 创建一个由对同一对象的多个引用组成的数组? - 2

    如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta

  4. ruby - 引用具有指定索引的枚举器值 - 2

    假设我有一个可枚举对象enum,现在我想获取第三个项目。我知道一种通用方法是转换成数组,然后使用索引访问,如:enum.to_a[2]但这种方式会创建一个临时数组,效率可能很低。现在我使用:enum.each_with_index{|v,i|breakvifi==2}但这非常丑陋和多余。执行此操作最有效的方法是什么? 最佳答案 你可以使用take剥离前三个元素,然后剥离last从take给你的数组中获取第三个元素:third=enum.take(3).last如果您根本不想生成任何数组,那么也许:#Ifenumisn'tanEnum

  5. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  6. ruby - 在多个线程中引用类方法会导致自动加载循环依赖崩溃 - 2

    代码:threads=[]Thread.abort_on_exception=truebegin#throwexceptionsinthreadssowecanseethemthreadseputs"EXCEPTION:#{e.inspect}"puts"MESSAGE:#{e.message}"end崩溃:.rvm/gems/ruby-2.1.3@req/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:478:inload_missing_constant':自动加载常量MyClass时检测到循环依赖稍加研究后,

  7. Ruby 泄露的对象被 RubyVm::Env 引用 - 2

    我正在跟踪我们的应用程序(ruby2.1)中的内存泄漏问题。我正在使用这两种技术:ObjectSpace.dump_all将所有对象转储到JSON流,然后进行离线分析。我使用的第二种技术是使用ObjectSpace.reachable_objects_from进行实时分析。在这两种方式中,我发现我泄漏的对象被一个对象RubyVM::Env引用。任何人都可以向我解释什么是RubyVM::Env。如何删除这些引用? 最佳答案 RubyVM::Env是一个包含变量引用的内部ruby​​类。这是我的测试:require'objspace'a

  8. ruby - 方法如何引用运算符。 : work? - 2

    这个问题不是很有用因为themethodreferenceoperatorwasremovedfromRuby2.7.0发布前。由于历史原因,这个问题被搁置了。Ruby2.7.0-preview1引入了方法引用运算符.:作为实验性功能。(更多here和here)。有一些抽象示例可用于说明如何使用这个新运算符:method=42.:to_s=>#method.receiver=>42method.name=>:to_smethod.call=>"42"和:method=File.:read=>#method.call('/Users/foo/.zshrc')=>"exportZSH=$H

  9. ruby 认为我在引用一个顶级常量,即使我指定了完整的命名空间 - 2

    在我的应用程序中我有classUserincludeUser::FooendUser::Foo定义在app/models/user/foo.rb现在我正在使用一个定义了自己的Foo类的库。我收到此错误:warning:toplevelconstantFooreferencedbyUser::FooUser仅引用具有完整路径的Foo,User::Foo,而Foo实际上从来没有指的是Foo。这是怎么回事?更新:才想起我之前遇到过同样的问题,在问题1中看到这里:HowdoIrefertoasubmodule's"fullpath"inruby? 最佳答案

  10. ruby - 维基引用API? - 2

    我想通过JSON获取Wikiquote页面的结构化版本(基本上我需要所有短语)示例:http://en.wikiquote.org/wiki/Fight_Club_(film)我试过:http://en.wikiquote.org/w/api.php?format=xml&action=parse&page=Fight_Club_(film)&prop=text但我得到了所有HTML源代码。我需要每个pharse作为数组的一个元素我如何使用DBPEDIA实现这一目标? 最佳答案 首先,我不确定您是否可以使用DBpedia查询wiki

随机推荐