MySQL查询基于表更新mysql中的列?

时间:2013-02-08 02:00:47

标签: mysql

假设我有以下表格:

表A

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”列获取以下值:

tableB的

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的原因是因为上述两个标准,Jordan,Molly和Paris都碰巧以某种方式联系在一起。 (他们都去了西班牙)和其他国家,即德国也访问了西班牙的乔丹,所以它有相同的group_num。约翰也访问了沙特阿拉伯,他也访问了西班牙,因此它拥有相同的group_num。

是否有一些SQL查询或查询(可能会或可能不会涉及创建其他“补充”表以获得上面显示的所需结果?(即如果group_num应该首先是可以的填充auto_incrementing值,如“id”,如果有必要,稍后更新。(可以为当前显示为“(空)”的其他值字段设置非空值

游标/迭代非常慢......以下是我将执行以填充这些值的步骤,使用游标的过程非常缓慢,如果我可以摆脱它,那就太棒了:

  1. 对于tableA,我们看到Jordan在5岁时访问​​了德国。(表5中的Group_Num为[5,德国]更新为1)。
  2. 乔丹6岁时访问西班牙。(西班牙队6号队的队员更新为1,显示与乔丹访问西班牙的队员相同)
  3. Molly在6岁时访问西班牙(group_num为[6,西班牙]]更新为1,因为即使它是一个不同的人,同一年龄/国家对被击中了)
  4. 巴黎7岁时访问了法国(表格B中的group_num因为不同年龄而更新为2人,无论年龄大小,都访问了一个完全不同的国家。
  5. 约翰7岁时访问沙特阿拉伯(table_num为[7,沙特阿拉伯],表B更新为3岁,年龄+国家对)
  6. John在5岁时访问​​了沙特阿拉伯(group_num为[5,沙特阿拉伯],在表B中更新为3岁以上的年龄+国家/地区,因为它还是约翰)
  7. John在6岁时访问西班牙(group_num为[6,西班牙]已经是1 .. Jordan之前访问过那里,可能会有一些分组...所以group_num为John访问的所有地方[6,西班牙],[ 5,沙特阿拉伯]和[7,沙特阿拉伯]全部更新为1

2 个答案:

答案 0 :(得分:1)

您将需要一种迭代方法,该方法将基于添加到Table1的每个新项目,如果您为每个此类项目执行以下语句,它将是快速有效的:

在插入表1中的最后一条记录之前,这是db的状态SQLFiddle

顺便说一句:你的例子与你的描述并不完全一致,我认为你错误地将法国7作为第1组签名,因为巴黎与第1组中的任何人没有关系。

注意我正在执行的选择:

  1. 第一个搜索我以前访问过的地方的组数(这是我的不相交组,例如组3)。
  2. 第二个是搜索插入的记录可能与之相关的脱节组,搜索组号为西班牙和年龄6。
  3. 在发现你有两个因新插入记录而加入的不相交集合之后,你可以将先前被指定为第二个组号的所有组号更新为第一个,这样:

    UPDATE Table2 set group_num = 1 where group_num = 3

    所以我没有使用任何游标,但是这个更新是针对表1的每个插入。

答案 1 :(得分:0)

@ 大马库西你可以看到跳跳器是否可以工作而不是游标。如果只有在数据插入表A时才能动态更新group_num,则触发器比游标更快。