2012-10-15 74 views
1

我的SQL查詢,到目前爲止有幾個連接表和最後的輸出是這樣的:標誌重複

FLAG  id  name 
----  ---  ---- 
OK   21  ken 
OK   34  mon 
OK   51  jil 
OK   51  jil 
OK   71  jil 
OK   80  ron 
OK   91  ron 

現在我想重名的標誌顯示爲「DUP」最低ID:

FLAG  id  name 
----  ---  ---- 
OK   21  ken 
OK   34  mon 
OK   51  jil 
dup_51  51  jil 
dup_51  71  jil 
OK   80  ron 
dup_80  91  ron 

我可以通過使用存儲在一個文件中的記錄外殼/ perl腳本做到這一點,但需要知道它是否可以通過操縱我的SQL查詢可以..感謝您的時間和幫助。

+0

這是非常不平凡的。任何理由你必須做到這一點,而不是在客戶端? –

+0

您需要爲每一行都有唯一的行ID,甚至是dupe。那麼你爲id和name的每個唯一組合選擇min(rowID),然後將該rowID更新爲OK,其他所有內容都是僞造的 – amphibient

+0

如果你想在mysql中執行它,請檢查用戶定義的變量和案例。 – Venu

回答

2

我會建議一個子查詢,跟蹤name上的重複條目並返回每個副本的最小值id。我會asume你的表被命名爲tbl

select name, min(id) as dupId 
from tbl 
group by name 
having count(name) > 1 

現在你可以用你的原始表加入這個:

select 
    tbl.*, if(not isnull(dupId), 'Ok', concat('dup_', dupId)) as flag2 
from 
    tbl 
    left join (
     select name, min(id) as dupId 
     from tbl 
     group by name 
     having count(name) > 1) as a on tbl.name = a.name 

這是一個辦法做到這一點。希望它可以幫助你。

+0

Thanks for this 。然而,我在shell腳本中做了這樣的事情:逐行處理舊的輸出文件,並與prev行進行比較。 – Drek

+0

@Drek很好..無論如何,這是最好的解決方案(就像Mark B評論的那樣)...但是,如果你需要在* mysql裏面做,你需要使用一些子查詢。樂於幫助 – Barranka