UPDATE语句,具有多个WHERE条件的COUNT

时间:2012-08-06 14:07:00

标签: mysql

我有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字段,{{1} }。

但是,TABLE2的大小为8500条记录,TABLE1的大小为65,000条记录。运行以下查询时,它会超时并丢失MySQL连接。

TABLE2

我对JOIN的有限理解使我相信JOIN对效率没有帮助,所以我很困惑。那里有什么想法吗?

@MarkByers -

JOIN创建一个临时表,两个表的串联,是吗?我的想法是,无论如何,我仍然需要将一个表格与另一个表格中的四个字段(日期,时间,课程,跑步者)进行比较。

我尝试了这个,但它也超时了:

1 个答案:

答案 0 :(得分:0)

  1. update子句中删除 table1 ,因为您已经使用嵌套的选择计数... 连接表(内部)。您正在加入 table2 table1 而没有where子句,结果产品太大而无法处理您的引擎超时。

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

  3. 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);