2016-06-10 28 views
1

我需要選擇具有非重複的ID的所有數據.. 這裏是我的示例表..需要幫助的SQL查詢 - 重複的多個數據項中選擇數據在一個數據字段

---------------------------------------------------------------------------------- 
ID  | Zip-Code  | Search Query  | ID_LIST 
---------------------------------------------------------------------------------- 
1   | 1000   | Query Sample 1  | 13,14,15, 
---------------------------------------------------------------------------------- 
2   | 2000   | Query Sample 2  | 16,13,17, 
---------------------------------------------------------------------------------- 
3   | 3000   | Query Sample 3  | 18,17,13, 
---------------------------------------------------------------------------------- 
4   | 4000   | Query Sample 4  | 15,16,17,18, 
---------------------------------------------------------------------------------- 
5   | 5000   | Query Sample 5  | 19, 20, 

u能看到該ID爲1和2有重複的,這是13 ID_LIST

2和3也有重複,這是13和17

我想要做的就是像這樣......

---------------------------------------------------------------------------------- 
ID  | Zip-Code  | Search Query  | ID_LIST 
---------------------------------------------------------------------------------- 
1   | 1000   | Query Sample 1  | 13,14,15, 
---------------------------------------------------------------------------------- 
2   | 2000   | Query Sample 2  | 16,17, 
---------------------------------------------------------------------------------- 
3   | 3000   | Query Sample 3  | 18, 
---------------------------------------------------------------------------------- 
5   | 5000   | Query Sample 5  | 19,20, 

什麼查詢會對此有好處?任何幫助?

+0

爲什麼不是1只是14,15? –

+0

ID_LIST上的13被輸入到ID號2中,所以我不想將它包含在ID號2中 –

+2

[**在數據庫列中存儲分隔列表真的很糟糕嗎?**](http:// stackoverflow .com/questions/3653462/is-stored-a-delimited-list-in-a-database-column-really-that-bad) – 1000111

回答

0

最好的方法來處理它是normalize您的數據,如評論中所述。但是,如果你絕對必須這樣做,那麼在查詢mysql時將會非常困難。

我建議你爲它創建一個程序。當你開發每一步時,你可以谷歌該步驟的特定解決方案,並測試並建立。讓我知道如果任何一步聽起來令人困惑/不清楚。

  1. 創建一個變量字符串,比如v_vals。用null初始化。在過程結束時,它將包含所有不同的值id_list13,14 ... 20
  2. 遍歷每一行。
  3. 計算逗號的個數id_list
  4. 從1循環到逗號數。
  5. 在每次迭代中,使用substringinstring來查找每個逗號的位置,然後從id_list中提取值。 (13,14 ...)
  6. 使用另一個變量v_id_list。把null放在裏面。
  7. v_vals中搜索值(來自步驟5)。如果它們存在於v_val中,則跳過它們,否則將它們放在v_valv_id_list中。
  8. 現在運行更新聲明以更新id_listv_id_list

現在對每一行重複步驟38

  • 注意v_id_list將被重新初始化爲每個循環,然而v_val將包含id_list所有不同的值。