7

假设我有以下表格:

表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

表B

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 的原因是因为上述两个条件,Jordan、Molly 和 Paris 都发生了某种联系。(他们都去了西班牙)和其他国家,即德国被约旦访问过,约旦也访问过西班牙,所以它有相同的group_num。约翰访问了沙特阿拉伯,他也访问了西班牙,因此它具有相同的 group_num。

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

游标/迭代非常慢......以下是我填写这些值的步骤,使用游标的过程非常慢,如果我能摆脱它,那就太好了:

  1. 对于表 A,我们看到 Jordan 在 5 岁时访问了德国。(表 B 中 [5,Germany] 的 Group_Num 更新为 1)。
  2. 乔丹在 6 岁时访问西班牙。([6,Spain] 的 Group Num 更新为 1,以显示其与 Jordan 访问西班牙的同一个人的分组相同)
  3. 莫莉 6 岁时访问西班牙([6,Spain] 的 group_num 更新为 1,因为即使它是不同的人,相同的年龄/国家对被击中)
  4. 巴黎在 7 岁时访问了法国(表 B 中的 group_num 更新为 2,因为她是一个不同的人,访问了一个完全不同的国家,无论年龄大小。
  5. 约翰在 7 岁时访问了沙特阿拉伯(表 B 中 [7,Saudi Arabia] 的 group_num 更新为年龄+国家对中的 3)
  6. 约翰在 5 岁时访问沙特阿拉伯(表 B 中 [5,Saudi Arabia] 的 group_num 更新为 3 年龄+国家对,因为它仍然是约翰)
  7. 约翰在 6 岁时访问了西班牙([6,Spain] 的 group_num 已经是 1.. 约旦之前去过那里,可能有一些分组...所以 group_num 代表约翰访问过的所有地方 [6, Spain], [5, Saudi阿拉伯]和[7,沙特阿拉伯]都更新为1
4

2 回答 2

1

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

这是在表 1 中插入最后一条记录之前数据库状态的SQLFiddle 。

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

注意我正在执行的选择:

  1. 第一个搜索了我以前访问过的地方的组 num(这是我的不相交组,例如组 num 3)。
  2. 第二个是搜索是否存在插入的记录可能相关的不相交组,通过在组 num 中搜索 spain 和 age 6。

在发现您有两个由于新插入的记录而成为连接的不相交集后,您可以更新之前分配为第二个组号的所有组 num 到第一个组,方式如下:

UPDATE Table2 set group_num = 1 where group_num = 3

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

于 2013-02-17T20:22:26.520 回答
0

@Damascusi 你可以看看跳跳虎是否可以代替游标工作。如果您可以在将数据插入表 A 时即时更新 group_num,则触发器比游标快。

于 2013-02-11T10:20:18.563 回答