2017-02-11 96 views
1

我有以下數據庫,並希望刪除紅色的,因爲它們是雙向的。所以我必須檢查每一行,如果另一行由pid,price,price_old,link和shop匹配。SQL:刪除重複的行? (PHP)

但是,我該如何檢查,如何刪除它呢?

enter image description here

也許一個更簡單的方法是將產生從每一行內的值的ID。因此,如果行內的值相等,那麼id將相等,並且只有一個值與其他id進行比較。 這是更好的方法嗎? - 如果是,我該怎麼做?

問候!

回答

1

你有沒有辦法讓THI不同行,你可以使用

ALTER TABLE my_table 
ADD id int NOT NULL AUTO_INCREMENT 

一旦完成,你可以在ID在哪裏不是你需要的值分組最小不能使用添加uniqie ID的事實定義重複

delete from my_table 
where id NOT in (select min(id) from my_table 
        group by shop, link 
       ) 
+0

我還沒有ID尚未...我怎麼能讓我從值 - pid,價格,price_old,鏈接和商店生成一個ID? – Jan

+0

我也更新了id代的asnwer – scaisEdge

0

最簡單的方法是運行distinct查詢:

select distinct pid, price, price_old, link, shop 
from t; 

您可以使用into創建一個新表格。這是最簡單的方法。因爲所有的列都是一樣的,所以MySQL不提供一個簡單的方法來刪除重複的行(同時留下其中一個)。

但是,您的當前結果可能由查詢生成。如果是這樣,您可以將select distinct添加到查詢中。但是,修復查詢會更好,因此不會生成重複項。如果是這種情況,請詢問另一個問題與樣品數據,期望的結果(作爲文本,而不是圖像)和您正在使用的查詢。

+0

不,它不是來自查詢。我有一個每24小時運行一次的cronjob。但我的問題是,這個Cronjob會添加新的數據,並且一些值將仍然與以前的cronjob中的值相同,但是一些值將與以前的cronjob中的值不同。 所以我唯一的辦法是刪除所有重複的行而留下其中的一個。 – Jan

+0

@Jan。 。 。您應該修復cron作業,以免插入重複值。另外,每行應該(至少)具有唯一的id(自動遞增)和創建日期/時間。 –

0

測試此首先在測試表:

DELETE t1 
FROM t t1, t t2 
WHERE t1.id > t2.id AND t1.price = t2.price 
    AND t1.link = t2.link AND t1.shop = t2.shop 
    AND t1.price_old = t2.price_old; 

基本上你刪除的一個與如果這些參數相等

0
select * from 
(select pid, price, price_old, link , 
row_number() over(partition by pid, price, price_old, link, shop order by pid) as rank 
from my_table) temp 
where temp.rank = 1 

這個查詢組由所有列第一的最高ID並將其排名。重複的行將具有> 1的等級。無論我們採取第一行還是第二行,因爲兩者都是彼此的副本。我們只取第一行的行。不重複的行也會有第一行,因此不會被忽略。

另一種方法是使用聯合。

select * from my_table UNION select * from my_table