我回到这里,出于与以前的问题有关的另一个问题。不久前,我创建了一个简单的Web产品解析器应用程序,该应用程序帮助我节省了不同的网站上的一些价格并进行了一些比较,但是过了一会儿,我发现了一个相对的大问题。我将在下面解释所有内容。
我有很多MySQL表具有以下格式:
-
products
带有ID,名称,链接 -
products-prices
带有ID,ID_PROD,价格,可用性和日期
您可以看到,在products-prices
表中,有一个带有ID_Prod的单元格,该单元格链接到products
表中的ID。当我解析每种产品的链接时,尽管它们是独一无二的,但实际上发生了一些事情,对于每种产品,我都有3-4个链接。例如,让我们考虑www.example.com/smth,而不是像这样解析它(没有http/s和/在决赛中(,我在db中放置了整个链接,出于某种原因,我现在有4种不同的产品(基本上是基本上是不同的产品(同一(与http://www.example.com/smth,https://www.example.com/smth,http://www.example.com/smth/,https://wwww.example。com/smth/。现在,我想进行查询以修复我的数据库,基本上是删除1到3个条目,并将一个产品保留在products
中,并从products-prices
中的每个条目中更改ID_Prod。
我不想直接答案,相反,如果您可以将我路由到我需要使用的语法的教程/概念,我将不仅感谢您。祝你有美好的一天!
编辑,现实世界示例
- https://images2.imgbox.com/f5/a5/0bdvqxcu_o.png
- https://images2.imgbox.com/22/e8/btbplcze_o.png
在第一张图片中,您可以看到这三个产品之间的唯一区别是链接,在链接中,唯一的区别是其中一个是http,另一个是https,而这2个HTTPS之间的一个是决赛砍。在第二张图片中,我有很多(是的,我知道非常低效(的条目,在此示例中,我想指向第一个图片中具有ID 2的产品。
尝试一个简单的分组以确定问题的规模:
SELECT (COUNTPRODID) C, PRODID
FROM YOURTABLE
GROUP BY PRODID
HAVING COUNT(PRODID) >1
确定了问题的规模后,您可以根据基于prodid的序列创建一个记录阶段的表,如下:
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