2015-12-21 104 views
-4

我有一個名爲「通道」具有以下屬性表。減少MySQL數據庫elminiate重複

CREATE TABLE `lane` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `origRegion` varchar(45) NOT NULL, 
    `origState` char(2) NOT NULL, 
    `destRegion` varchar(45) NOT NULL, 
    `destState` char(2) NOT NULL 
    PRIMARY KEY (`id`) 
) 

該表中有以下列的重複行:origState,origRegion,destState,destRegion。我希望能夠選擇所有行JOINED到min(id)是第一次出現的行數。

例如,具有數據:

 
1 ALL MA ALL OH 
2 ALL MA ALL OH 
3 ALL MA ALL OH 

和一個類似的SQL(其射門所有重複的行):

select l.*, l2.count, l2.minId from tmpLane l 
JOIN (SELECT id, min(ID) as minId from tmpLane 
    GROUP BY origRegion, origState, destRegion, destState) l2 on l.id = l2.id; 

結果(注意最後的計數和minId) :

 
1 ALL MA ALL OH 3 1 
2 ALL MA ALL OH 3 1 
3 ALL MA ALL OH 3 1 

請注意,上面使用的查詢是解決方案的改編here(在這種情況下不工作)

+1

是最後一個結果顯示出你想得到的結果還是錯誤結果?請出示什麼是預期的結果 – Roberto

+0

那會刪除所有的DUP查詢工作更適合您? – Bohemian

+0

顯示的結果是我所期望的。我實際得到的只是一排。刪除查詢將不起作用。 –

回答

1

聖誕快樂!

SELECT ID, 
     origRegion, 
     origState, 
     destRegion, 
     destState, 
     (SELECT COUNT(*) 
     FROM Lane l3 
     WHERE l.origRegion = l3.origRegion 
     and l.origState = l3.origState 
     and l.destRegion = l3.destRegion 
     and l.destState = l3.destState) as 'Count', 
     (SELEcT MIN(ID) 
     FROM Lane l2 
     WHERE l.origRegion = l2.origRegion 
     and l.origState = l2.origState 
     and l.destRegion = l2.destRegion 
     and l.destState = l2.destState) as minID 
FROM lane l 
+0

我不只是要在第一次出現時,我想用添加的列提供一個唯一的實例(分(ID))所有出現。 –

+0

編輯爲你...聖誕快樂! – DiscipleMichael

+0

太棒了。謝謝。 –

1

您可以運行此查詢,以便從數據庫中刪除所有重複的行: -

ALTER IGNORE TABLE `lane` 
ADD UNIQUE INDEX (`origRegion`, `origState`, `destRegion`, `destState`); 

這將添加唯一索引到你的表並刪除所有dulicate行將確保將來不會插入重複的行。

+1

的問題是,OP要對每行顯示重複的行數,而不是僅僅刪除或完全忽略他們。 – DiscipleMichael

+0

只有看看有多少人才有幫助。我不想刪除行。我只想選擇哪些重複,並提出可以使用的單個實例(分鐘)。 –