基于两个表修复数据库

时间:2018-02-15 13:09:32

标签: mysql database repair

我回到这里寻找与我之前相关的另一个问题。前段时间我创建了一个简单的网络产品解析器应用程序,帮助我在不同的网站上保存一些价格并进行一些比较,但过了一段时间后,我发现了一个相对大的问题。我将在下面解释一切。

我有很多具有以下格式的Mysql表:

  • products,ID,姓名,链接
  • products-prices包含id,id_prod,价格,可用性和日期

如您所见,在products-prices表中有一个id_prod的单元格链接到products表中的id。当我解析每个产品的链接时我虽然它们是独一无二的,但实际上发生了一些事情,而且对于每个产品我都有3-4个链接。例如,让我们考虑www.example.com/smth,而不是像DB那样解析它(在最后没有http / s和/)在DB中我把整个链接放在一起由于某种原因现在我有4种不同的产品(基本上同一个人http://www.example.com/smthhttps://www.example.com/smthhttp://www.example.com/smth/https://www.example.com/smth/。现在我想查询修复我的数据库,基本上是删除1到3个条目,只保留products中的一个产品,并且还更改products-prices中每个条目的id_prod。

我不想直接回答,相反,如果您可以将我引导到我需要使用的语法的教程/概念,我将非常感谢。祝你有个美好的一天!

编辑,真实世界的例子

在第一张图片中,您可以看到这3个产品之间的唯一区别是链接,而在链接中唯一的区别是其中一个是http,其他的是https,而在这两个https之间有一个在决赛中砍杀。在第二张图片中,我有很多(我知道非常低效)的条目,我希望在这个例子中指向第一张图片中id为2的产品。

1 个答案:

答案 0 :(得分:1)

尝试一个简单的分组来确定问题的严重程度:

 SELECT (COUNTPRODID) C, PRODID
 FROM YOURTABLE
 GROUP BY PRODID
 HAVING COUNT(PRODID) >1

确定问题的规模后,您可以使用基于PRODID的序列创建一个表来记录您的记录1,如下所示:

 SELECT * INTO TmpTable
 FROM
 (SELECT 
    @row_number:=CASE
    WHEN @PRODID  = PRODID THEN @row_number + 1
    ELSE 1
   END AS SEQ,
   @PRODID :=PRODID as PRODID
   FROM
   YOURTABLE
   ORDER BY PRODID;) dups
WHERE dups.SEQ = 1

然后,您可以删除源中的所有行

 DELETE FROM YOURTABLE
 WHERE PRODID IN (SELECT PRODID FROM TmpTable)

然后最后从临时表中写回行:

 INSERT INTO YOURTABLE
 SELECT field1, field2 etc. FROM TmpTable