有人帮我理解TIMESTAMPDIFF中查询的执行情况

时间:2015-01-13 10:17:27

标签: mysql

 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;

它们是否作为嵌套执行"对于"循环?或者result1的第一行,result2的第一行

1 个答案:

答案 0 :(得分:0)

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

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

外部DO的每次迭代都以statement-1开头。当控制到达内部DO时,执行语句-2直到内部DO的某些条件使控制器离开它。然后,执行statement-3并完成一次迭代。内部DO中的任何EXIT都将内部DO的控制带到语句-3中的第一个语句。

以下是一些简单的例子:

在下面的嵌套循环中,外部循环从i到1运行,步长为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

一旦完成,i的值前进到下一个,内循环将再次迭代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运行。对于每个u,内部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范围内所有整数的和(即,Sum等于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

Newton的方法直接来自编程示例,其中X是当前猜测,NewX是新猜测,Value是平方根计算的数字。 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

很明显,Value的值从0.1开始,步长为0.1,直到1.0。因此,Value的值为0.1,0.2,0.3,...,0.9和1.0。对于Value的每个值,内部循环计算Value的平方根。外循环中的EXIT语句将控件移出外循环。