2015-01-13 113 views
-1
select * from events where detector='PhotoWatcher' 
    AND TIMESTAMPDIFF(second,(select event_occured from events where description 
    LIKE '%Lat:18%' OR '%Lng:73%' LIMIT 1), 
    (select event_occured from events where detector='PhotoWatcher' LIMIT 1))>0; 

它们是否作为嵌套的“for”循环执行?或与RESULT2的第一排RESULT1的第一排任何人都可以帮助我理解TIMESTAMPDIFF中查询的执行情况

+0

把'EXPLAIN'放在你的查询前,MySQL会告诉你。检查['EXPLAIN'输出格式](http://dev.mysql.com/doc/refman/5.7/en/explain-output.html)以了解如何改进其运行时间。 – axiac

回答

0

假设我们有以下的嵌套DO循环:

DO 
    statements-1 
    DO 
     statement-2 
    END DO 
    statement-3 
END DO 

外DO的每一次迭代开头的语句-1。当控制达到内部DO时,执行语句-2,直到内部DO的某些条件将控制移出。然后,执行语句-3并完成一次迭代。内部DO中的任何EXIT都会将控制权从内部DO中移出到语句-3中的第一个语句。

以下是一些简单的例子:

在下面的嵌套循环,外层一个具有i从1运行至9与步骤尺寸1.对于每次迭代,说的第i个,内循环迭代9次,其中j的值为1,2,3,4,5,6,7,8,9。因此,在i固定的情况下,WRITE被执行9次,并且输出由i * 1,i * 2,i * 3,...,i * 9。

INTEGER :: i, j 

DO i = 1, 9 
    DO j = 1, 9 
    WRITE(*,*) i*j 
    END DO 
END DO 

一旦做到这一点,我的价值是前进到下一个,而内循环将迭代9次再次显示新的I和1,2,3,4的产品... ,9.

净效应是一个乘法表。对于i = 1,显示1 * 1,1 * 2,1 * 3,...,1 * 9的值;对于i = 2,显示值为2 * 1,2 * 2,2 * 3,...,2 * 9; ...;对于i = 9,显示值为9 * 1,9 * 2,9 * 3,...,9 * 9。
下面显示了一个嵌套的DO循环。外面的一个让你从2运行到5.对于每个你,内在的DO让v从1运行到u-1。因此,当u是2时,v的值从1到1.当u是3时,v的值是1和2.当u是4时,v的值是1,2和3.最后,当u是5,v的值是1,2,3和4

INTEGER :: u, v 
INTEGER :: a, b, c 

DO u = 2, 5 
    DO v = 1, u-1 
     a = 2*u*v 
     b = u*u - v*v 
     c = u*u + v*v 
     WRITE(*,*) a, b, c 
    END DO 
END DO 

上面的讨论可以概括于下表中:

u Values for v 
2 1 


3 1 2 

4 1 2 3 
5 1 2 3 4 

对于每一对u的和v,内部循环计算a,b和c。因此,将产生以下结果(请验证):

u v a b c 
2 1 4 3 5 
3 1 6 8 10 
2 12 5 13 
4 1 8 15 17 
2 16 12 20 
3 24 7 25 
5 1 10 24 26 
2 20 21 29 
3 30 16 34 
4 40 9 41 

显而易见的是,内部的DO循环计算所有整数的和在范围1和i(即,总和等于1 + 2 + 3 + ... + I)。由于我运行从1到10,下面的循环计算十个和:1,1 + 2,1 + 2 + 3,1 + 2 + 3 + 4,...,1 + 2 + 3 + ... + 9和1 + 2 + 3 + ... + 9 + 10。

INTEGER :: i, j, Sum 

DO i = 1, 10 
    Sum = 0 
    DO j = 1, i 
     Sum = Sum + j 
    END DO 
    WRITE(*,*) Sum 
END DO 

下面的程序使用牛顿的方法来计算正数的平方根。实际上,它计算了数字0.1,0.1,...,0.9和1.0的平方根。

REAL :: Start = 0.1, End = 1.0, Step = 0.1 
REAL :: X, NewX, Value 

Value = Start 
DO 
    IF (Value > End) EXIT 
    X = Value 
    DO 
     NewX = 0.5*(X + Value/X) 
     IF (ABS(X - NewX) < 0.00001) EXIT 
     X = NewX 
    EBD DO 
    WRITE(*,*) 'The square root of ', Value, ' is ', NewX 
    Value = Value + Step 
END DO 

牛顿法是直接从编程实例截取,其中,X是当前猜想,下一页末是新猜测,并且值是用于平方根计算的数量。 EXIT语句将内部DO的执行引入WRITE语句。

如果内环路解除,我们有外部循环如下:

REAL :: Start = 0.1, End = 1.0, Step = 0.1 
REAL :: X, NewX, Value 

Value = Start 
DO 
    IF (Value > End) EXIT 
! 
! the inner loop computes the result in NewX 
! 
    WRITE(*,*) 'The square root of ', Value, ' is ', NewX 
    Value = Value + Step`enter code here` 
END DO 

清楚的是,值的值与0.1开始,并具有步长0.1直至1.0。因此,Value的值是0.1,0.2,0.3,...,0.9和1.0。对于Value的每个值,内部循环计算Value的平方根。外循环中的EXIT语句将控制移出外循环。

相关问题