2012-09-20 43 views
3

我被困在一個非常基本的問題上,我想跳過具有三列重複值的行。在不同列上刪除相同值的行mysql

表飼料

id,type,user_id,friend_id,date 
1, 'friend', 4 , 5 , 5/5/2010 
2, 'friend', 5 , 4 , 5/5/2010 

現在,這是如何將數據保存(我不能改變保存模塊)

因爲兩者具有同樣的事情,所以我想只挑選它們作爲1排不2. 我不想驗證,並在PHP端刪除它,二/三,如果我會在PHP做分頁會擾亂

編輯:

表結構

create table `feed` (
    `id` double , 
    `type` blob , 
    `user_id` double , 
    `type_id` double , 
    `date` datetime 
); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('78','friends','1314','1313','2012-09-03 19:48:14'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('79','friends','1313','1314','2012-09-03 19:48:14'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('80','friends','1314','1312','2012-09-03 19:49:07'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('82','friends','1313','1312','2012-09-03 19:49:09'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('84','friends','1315','1312','2012-09-03 19:49:24'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('86','friends','1315','1313','2012-09-03 19:49:33'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('87','friends','1313','1315','2012-09-03 19:49:33'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('97','friends','1317','1312','2012-09-03 19:55:06'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('99','friends','1313','1317','2012-09-03 19:56:01'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('100','friends','1317','1313','2012-09-03 19:56:01'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('101','friends','1315','1317','2012-09-03 19:56:58'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('102','friends','1317','1315','2012-09-03 19:56:58'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('104','following','1313','1193','2012-09-03 19:59:39'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('105','following','1313','1308','2012-09-03 19:59:51'); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('106','following','1313','1098','2012-09-03 19:59:58'); 
+0

你想消除同樣的友誼記錄嗎? (如在給定記錄「5是4的朋友」意味着「4是5的朋友」) – mostar

+0

是我想消除同樣的友誼值,B/C 4-> 5和5-> 4是相同的 – MZH

+0

如果答案解決您的問題,請點擊綠色按鈕將其標記爲已接受。 – Zar

回答

1

這裏是最終的解決方案!如果存在相同的友情對(反轉),則只會使用user_id> friend_id。

SELECT DISTINCT type, user_id, friend_id, date 
FROM table t1 
WHERE t1.user_id > t1.friend_id 
    OR NOT EXISTS (
     SELECT * FROM table t2 
      WHERE t1.type=t2.type AND t1.date=t2.date 
      AND t2.user_id = t1.friend_id AND t2.friend_id = t1.user_id 
    ) 
+0

不錯的訣竅,它完成了這項工作!謝謝 – MZH

1

您正在查找的函數是DISTINCT()。這允許您按該列對錶進行分組並刪除重複項。

只要確保在你的SELECT語句,你還可以選擇其他字段列,以及:

選擇id,DISTINCT(type),user_idfriend_iddate FROM TABLENAME

+0

以他的例子來說,'user_id'在兩行中都不相等,因此他們不會像你想要的代碼那樣「合併」他想要的東西嗎? – Zar

+0

沒有這種區別在這種情況下不起作用,看到這個時,我運行查詢http://screencast.com/t/eYm3JWNrXPCp – MZH

+0

@Zar,它應該抓住user_ids的1。 – Lathan

1

你可以在桌子上執行JOIN,這應該做你正在尋找的東西。 這樣的事情可能做的伎倆:

SELECT * FROM tableName a 
JOIN tableName b ON a.user_id = b.friend_id 
+0

將不起作用。它甚至不需要使用不同的「類型」和「日期」列。 – mostar

0

你應該通過運行擺脫那些重複的記錄:

DELETE FROM table t1 WHERE 
    EXISTS (
    SELECT * FROM table t2 
    WHERE t1.type=t2.type AND t1.date=t2.date 
     AND t2.user_id = t1.friend_id AND t2.friend_id = t1.user_id 
     AND t1.user_id > t2.user_id 
) 

然後你就可以得到不同的友誼記錄有:

SELECT DISTINCT type, user_id, friend_id, date FROM table 

此外,您可以編寫一個在INSERT上觸發的數據庫觸發器,該觸發器檢查是否存在重複的(具有反向的user_id和friend_id)。如果存在,則執行ROLLBACK,否則允許INSERT。

相關問題