我有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创建一个临时表,两个表的串联,是吗?我的想法是,无论如何,我仍然需要将一个表格与另一个表格中的四个字段(日期,时间,课程,跑步者)进行比较。
我尝试了这个,但它也超时了:
答案 0 :(得分:0)
从update
子句中删除 table1 ,因为您已经使用嵌套的选择计数... 连接表(内部)。您正在加入 table2 和 table1 而没有where
子句,结果产品太大而无法处理您的引擎超时。
检查嵌套where
中的select
子句,我认为您应该按Runner过滤查询,否则您将计算具有相同时间,日期,课程等的不同Runners ;除非那是你想要的。
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);