2013-02-08 39 views
7

假設我有以下表格:MySQL查詢更新MySQL中的列基於表?

TABLEA

a_name | age | country 
Jordan | 5 | Germany 
Jordan | 6 | Spain 
Molly | 6 | Spain 
Paris | 7 | France 
John | 7 | Saudi Arabia 
John | 5 | Saudi Arabia 
John | 6 | Spain 

tableB的

id (auto increment primary key) 
    | age | country  | group_num (initially null) 
1 | 5 | Germany  | 
2 | 6 | Spain  | 
3 | 7 | France  | 
4 | 7 | Spain  | 
5 | 8 | France  | 
6 | 9 | France  | 
7 | 2 | Mexico  | 
8 | 7 | Saudi Arabia | 
9 | 5 | Saudi Arabia | 

我希望能夠做某種選擇/更新我在哪裏可以得到以下的「group_num」列的值:

表B

id (auto increment primary key) 
    | age | country  | group_num 
1 | 5 | Germany  | 1 
2 | 6 | Spain  | 1 
3 | 7 | France  | 1 
4 | 7 | Spain  | 
5 | 7 | France  | 2 
6 | 9 | France  | 
7 | 2 | Mexico  | 
8 | 7 | Saudi Arabia | 1 
9 | 5 | Saudi Arabia | 1 

group_num基於的標準進行安排:

1) Places person "a_name" went. 
2) Whether other people visited that same country. (regardless of age). 

之所以ID的1,2,3,8,9都具有相同的groupId是因爲喬丹,莫莉和巴黎都發生在由於上述兩個標準而以某種方式相關聯。 (他們都去了西班牙)和其他國家,也就是德國也拜訪過西班牙的約旦,所以它有同樣的組織名稱。約翰訪問了沙特阿拉伯,他也訪問了西班牙,所以它有同樣的group_num。

有一些SQL查詢或查詢(可能會或可能不會涉及其他「互補」表創建去上面顯示期望的結果?(即它是好的,如果group_num應先充滿auto_incrementing值就像「id」一樣,如果有必要,稍後更新(可以爲其他值字段顯示非空值爲「(空)」

遊標/迭代非常慢......以下是我將執行的填寫這些值的步驟,使用光標的過程非常緩慢,如果我可以擺脫它,那將是非常好的:

  1. 對於表格A,我們看到約旦5歲時訪問​​過德國。(表格[Group_Num,德國]中的數字更新爲1)。
  2. 約旦訪問西班牙在6歲(集團民爲[6,西班牙]更新爲1,以顯示其相同的分組一樣的傢伙約旦訪問西班牙)
  3. 莫莉訪問西班牙6歲(group_num爲[6 ,西班牙],因爲即使它是一個不同的人,同樣的年齡/國家對被擊中)
  4. 巴黎7歲時訪問了法國(tableB中的group_num更新爲2,因爲她是一個不同的人,訪問了一個完全不同的人國家,不分年齡
  5. 約翰7歲時訪問沙特阿拉伯(沙特阿拉伯[7,沙特阿拉伯]在tableB中的group_num更新爲3年齡+國家對)
  6. John在5歲時訪問​​沙特阿拉伯(表格B中的[5,沙特阿拉伯]的group_num自從它仍然是約翰以來更新爲年齡+國家對3)
  7. 約翰6歲時訪問西班牙([6,西班牙]的group_num已經是1。 ,可能會有一些分組...所以group_num約翰參觀了所有的地方[6,西班牙],[5,沙特阿拉伯]和[7,沙特阿拉伯]全部更新爲1
+4

[你有什麼嘗試?](http://www.whathaveyoutried.com/)請參閱[問問建議](http://stackoverflow.com/questions/ask-advice)。 –

+0

以編程方式使用SQL遊標遍歷tableA的每一行,並根據需要更新tableB。如果可能,使用SQL查詢(ies)尋求一種更好的方法。 – Rolando

+1

不幸的是,在這個例子中的人有像喬丹(一個國家)和巴黎(在另一個國家的着名城市)的名字 – Magnus

回答

1

您需要將根據每個新產品加入表1迭代的方法,如果您執行以下語句爲每個這樣的項目將是快速,高效:

這裏是SQLFiddle的狀態db之前插入表1中的最後一條記錄。

順便說一句:您的示例與您的描述不完全一致,我假設您錯誤地簽署了法國7作爲第1組,因爲巴黎與組1中沒有任何關係。

注意我正在執行的選擇:

  1. 第一個搜索我之前去過的地方的組數(這是我的不相交組,例如,組3)。
  2. 第二個是搜索是否有插入的記錄可能與一個不相交組,通過搜索西班牙組NUM和年齡6

找出您有成爲加入兩個不相交集後作爲新插入的記錄的結果,你可能是更新所有組NUM先前分配作爲第二組號碼的第一位,在這樣的方式:

UPDATE Table2 set group_num = 1 where group_num = 3

,所以我沒有使用任何遊標,但此更新針對表1的每個插入。

0

@ 大馬士革,你可以看到是否虎跳虎可以代替遊標。如果僅在數據插入到表A中時纔可以隨時更新group_num,則觸發器比光標快。