0

私は次のように持ってTABLE1います

+----------+----------+----------+----------+----------+
+ date     + time     + course   + runner   + position +
+----------+----------+----------+----------+----------+
+ 20120701 + 1200     + london   + aaa      +   1st    +
+ 20120701 + 1200     + london   + bbb      +   2nd    +
+ 20120701 + 1200     + london   + ccc      +   3rd    +
+ 20120701 + 1300     + london   + eee      +   1st    +
+ 20120701 + 1300     + london   + fff      +   2nd    +
+ 20120701 + 1400     + new york + ggg      +   1st    +
+ 20120701 + 1400     + new york + hhh      +   2nd    +
+ 20120702 + 2000     + london   + iii      +   1st    +
+ 20120702 + 2000     + london   + aaa      +   2nd    +
+ 20120702 + 2100     + new york + iii      +   1st    +
+ 20120702 + 2100     + new york + bbb      +   2nd    +
+----------+----------+----------+----------+----------+

と2番目のテーブル

+------+----------+------+--------+--------+-----+------+-------+
+idtbl2+ date     + time + course + runner + pos + link + total +
+------+----------+------+--------+--------+-----+------+-------+
+    1 + 20120701 + 1200 + london + aaa    + 1st + WWW  +       +
+    1 + 20120701 + 1200 + london + aaa    + 1st + XXX  +       +
+    1 + 20120701 + 1200 + london + aaa    + 1st + YYY  +       +
+    1 + 20120701 + 1200 + london + aaa    + 1st + XXX  +       +
+------+----------+------+--------+--------+-----+------+-------+

基本的にRUNNER、1つのイベントでの競技者の数()をカウントし、そのカウントを2番目のテーブルのフィールドにTABLE1更新する必要があります。TOTALTABLE2

ただし、TABLE1サイズは8500レコードで、サイズTABLE2は65,000レコードです。次のクエリを実行すると、タイムアウトになり、MySQL接続が失われます。

update table2 b, table1 a set b.total = (select count(a.runner) from table1 where a.date = b.date AND a.time = b.time AND a.course = b.course AND a.position != 'DQ'  ); 

JOINについての私の限られた理解は、JOINが効率に役立たないと信じるように私を導きます、それで私はかなり立ち往生しています。そこに何かアイデアはありますか?

@MarkByers-

JOINは、両方のテーブルを連結した一時テーブルを作成します。私の考えでは、何があっても、あるテーブルの4つのフィールド(日付、時刻、コース、ランナー)を別のテーブルと比較する必要があります。

私はこれを試しましたが、タイムアウトします:

4

1 に答える 1

0
  1. ネストされたSelectカウントでテーブルを(内部で)すでに結合しているため、句からtable1を削除します。句なしでtable2table1を結合している場合、結果の製品は処理するには非常に大きいため、エンジンがタイムアウトします。updatewhere

  2. whereネストされた句を確認してください。selectランナーでクエリをフィルタリングする必要があると思います。そうしないと、同じ時刻、日付、コースなどを持つさまざまなランナーをカウントします。それがあなたが望むものでない限り。

update table2 b
set b.total = (select count(a.runner) 
      from table1 
      where a.date = b.date 
      AND a.time = b.time 
      AND a.course = b.course 
      AND a.position != 'DQ'  
      AND b.runner = a.runner);
于 2012-08-06T14:27:13.673 に答える