2013-02-08 40 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,则触发器比光标快。