我回到这里寻找与我之前相关的另一个问题。前段时间我创建了一个简单的网络产品解析器应用程序,帮助我在不同的网站上保存一些价格并进行一些比较,但过了一段时间后,我发现了一个相对大的问题。我将在下面解释一切。
我有很多具有以下格式的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/smth,https://www.example.com/smth,http://www.example.com/smth/,https://www.example.com/smth/。现在我想查询修复我的数据库,基本上是删除1到3个条目,只保留products
中的一个产品,并且还更改products-prices
中每个条目的id_prod。
我不想直接回答,相反,如果您可以将我引导到我需要使用的语法的教程/概念,我将非常感谢。祝你有个美好的一天!
编辑,真实世界的例子
在第一张图片中,您可以看到这3个产品之间的唯一区别是链接,而在链接中唯一的区别是其中一个是http,其他的是https,而在这两个https之间有一个在决赛中砍杀。在第二张图片中,我有很多(我知道非常低效)的条目,我希望在这个例子中指向第一张图片中id为2的产品。
答案 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