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 を持つ理由は、上記の 2 つの基準により、Jordan、Molly、および Paris が何らかの形でリンクされているためです。(彼らは全員スペインに行きました) と他の国、つまり、ドイツは、同じくスペインを訪れたヨルダンによって訪れられたので、同じ group_num を持ちます。サウジアラビアは、スペインも訪れた John が訪れたので、group_num は同じです。

SQLクエリまたはクエリがありますか(上記の目的の結果を得るために、他の「補完的な」テーブルの作成が必要な場合とそうでない場合がありますか? (つまり、最初にgroup_numに「id」などのauto_incrementing値を入力しても問題ありません。その後、必要に応じて更新されます (現在「(空)」として表示されている他の値フィールドに null 以外の値を指定してもかまいません)。

カーソル/反復は非常に遅いです...これらの値を入力するために実行する手順は次のとおりです。カーソルを使用した非常に遅いプロセスです。これを取り除くことができれば、それは素晴らしいことです:

  1. tableA では、Jordan が 5 歳でドイツを訪れたことがわかります ([5,Germany] の tableB の Group_Num が 1 に更新されました)。
  2. Jordan は 6 歳でスペインを訪れます。
  3. Molly は 6 歳でスペインを訪れます ([6,Spain] の group_num は、別の人であるにもかかわらず、同じ年齢/国のペアがヒットしたため、1 に更新されました)。
  4. パリは 7 歳のときにフランスを訪れました (テーブル B の group_num は 2 に更新されました。彼女は年齢に関係なく、まったく別の国を訪れた別の人物だからです。
  5. John は 7 歳でサウジアラビアを訪れます (tableB の [7,Saudi Arabia] の group_num は age+country ペアの 3 に更新されます)
  6. ジョンは 5 歳でサウジアラビアを訪問します (表 B の [5,サウジアラビア] の group_num は、まだジョンであるため、年齢と国のペアの 3 に更新されます)
  7. ジョンは 6 歳でスペインを訪れます ([6, スペイン] の group_num は既に 1.. ヨルダンは以前にそこを訪れました。いくつかのグループ化がある可能性があります... したがって、ジョンが訪れたすべての場所の group_num [6, スペイン], [5, サウジアラビア] Arabia]、および [7,Saudi Arabia] はすべて 1 に更新されます
4

2 に答える 2

1

Table1 に追加された新しいアイテムごとに基づく反復アプローチが必要になります。そのようなアイテムごとに次のステートメントを実行すると、高速で効率的になります。

これは、表 1 の最後のレコードを挿入する直前のデータベースの状態の SQLFiddle です。

ところで: あなたの例はあなたの説明と完全には一致していません。パリはグループ 1 の誰とも関係がないため、誤ってフランス 7 をグループ 1 として署名したと思います。

私が実行している選択に注意してください:

  1. 最初のものは、私が以前に訪れた場所のグループ番号を検索しました(これは私のばらばらのグループです。たとえば、グループ番号3です)。
  2. 2 つ目は、グループ num でスペインと年齢 6 を検索することにより、挿入されたレコードが関連している可能性のある互いに素なグループがあるかどうかを検索します。

新しく挿入された record の結果として結合される 2 つのばらばらなセットがあることがわかった後、次のように、2 番目のグループ番号として以前に割り当てられたすべてのグループ番号を最初のグループ番号に UPDATE することができます。

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 に答える