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    +
+----------+----------+----------+----------+----------+

和第二张桌子

+------+----------+------+--------+--------+-----+------+-------+
+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从一个事件中计算竞争对手的数量( )TABLE1并将其更新到TOTAL第二个表的字段中,TABLE2.

但是,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

1 回答 1

0
  1. 从子句中删除table1update,因为您已经(内部)使用嵌套的Select count...加入表。您在没有子句的情况下加入table2table1where,生成的产品太大而无法处理,以至于您的引擎超时。

  2. 检查wherenested 中的子句select,我认为您应该按 Runner 过滤查询,否则您正在计算具有相同时间、日期、课程等的不同 Runner;除非那是你想要的。

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 回答