MySQL QUERY - 循环遍历表并执行条件计算(对于PHP)

时间:2014-05-08 00:21:13

标签: php mysql web

我在一个项目上工作,现在我处于盲点,试图解决这个问题。

我有一些名为 x_world 的MySQL表,其中包含一些列。这是一个例子:

 internalid     name     population           date
          1     John            100     2014-05-01
          2    Tommy            250     2014-05-01
          3     Paul            200     2014-05-01
          4    Holly            700     2014-05-01
          5     John            100     2014-05-02
          6    Tommy            240     2014-05-02
          7     Paul            201     2014-05-02
          8    Holly            680     2014-05-02
          9     John            100     2014-05-03
         10    Tommy            230     2014-05-03
         11     Paul            202     2014-05-03
         12    Holly            799     2014-05-03

我需要的是得到这个结果:

 name     population     (+-1d)     (+-3d)
 John            100         0          0
Tommy            230       -10        -20
 Paul            202        +1         +2

这是关于我的意思和需要的解释:

  • 允许的最大人口变化(增长)为2(包括2)。如果人口增长超过2,则不要在结果中显示此行。
  • 如果人口只是下降(无论多少),那就可以了,显示这一行。
  • 上述两个条件的组合:如果人口下降一天(无论多少),然后增长(不超过2) - 它也没关系,显示这一行。
  • 如果人口在这3天内没有变化,那就行了,显示这一行。

另外:

  • 结果中显示的人口值等于上一个已知值(最新日期)。
  • 计算两个值(+ -1d)和(+ -3d)。

我是PHP和MySQL的初学者。我对两者的基本知识都很熟悉,但MySQL部分对我来说看起来很疯狂:(我很感激每一个帮助。最后,抱歉我的英语不好。我尽我所能:)。

1 个答案:

答案 0 :(得分:1)

SELECT cur.name, cur.population,
       cur.population-d1.population AS `+-1d`, cur.population-d3.population AS `+-3d`
FROM (
    SELECT name, MAX(date) AS curdate
    FROM x_world
    GROUP BY name) AS maxes
JOIN x_world AS cur ON cur.name = maxes.name AND cur.date = maxes.curdate
JOIN x_world AS d1 ON d1.name = maxes.name AND d1.date = DATE_SUB(maxes.curdate, INTERVAL 1 DAY)
JOIN x_world AS d3 ON d3.name = maxes.name AND d3.date = DATE_SUB(maxes.curdate, INTERVAL 2 DAY)
HAVING `+-1d` <= 2 AND `+-3d` <= 2

DEMO

请注意,虽然您将其称为+-3d,但实际上在2014-05-01和2014-05-03之间只有2天。我保留了您的命名,但在计算中使用了INTERVAL 2 DAY