MySQL历史数据查找

时间:2015-07-27 18:28:53

标签: mysql

我一直在四处寻找并试图让它发挥作用,但我似乎无法得到它。我有2张桌子:

TABLE: products

| id | name      | some more values |
|----|-----------|------------------|
| 1  | Product 1 | Value 1          |
| 2  | Product 2 | Value 2          |
| 3  | Product 3 | Value 3          |


TABLE: value

| pid | value     | stamp            |
|-----|-----------|------------------|
| 1   | 7         | 2015-07-11       |
| 2   | 4         | 2015-07-11       |
| 3   | 8         | 2015-07-11       |
| 1   | 9         | 2015-07-21       |
| 2   | 4         | 2015-07-21       |
| 3   | 6         | 2015-07-21       |

第一个表只有一个产品列表,第二个表有每个产品的值(通过pid),以及值的时间戳。 注意:时间戳不是每天都有,也不是均匀分布。

我想要的是这样的结果表:

| id | name      | some more values | value now | value last month |
|----|-----------|------------------|-----------|------------------|
| 1  | Product 1 | Value 1          | 9         | 7                |
| 2  | Product 2 | Value 2          | 4         | 4                |
| 3  | Product 3 | Value 3          | 6         | 8                |

现在价值'是最新时间戳的值,上个月的值是'是最接近最新时间戳的时间戳的值 - 30天。请记住,-30天可能没有特定的时间戳,查询将需要找到最接近的时间戳。 (只查看向上或向下并不重要,它是一个近似值。)

我提出了一些很大的疑问,但我非常确定必须有一个更简单的方法......任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

假设您通过PHP或mysql函数获得上个月和年份,这是一个未经检查的查询,我希望它能在第一次使用:

SELECT *, v_now, v_lastmonth FROM products p 
LEFT JOIN (SELECT `value` AS v_now FROM value ORDER BY stamp DESC) AS v_now ON p.id=v_now.pid
LEFT JOIN (SELECT `value` AS v_lastmonth FROM value 
WHERE month(stamp)='$month' AND year(stamp)='$year'
ORDER BY stamp DESC) AS v_now ON p.id=v_now.pid

您可以使用group by为每个产品结果获取一行。