我一直在四处寻找并试图让它发挥作用,但我似乎无法得到它。我有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天可能没有特定的时间戳,查询将需要找到最接近的时间戳。 (只查看向上或向下并不重要,它是一个近似值。)
我提出了一些很大的疑问,但我非常确定必须有一个更简单的方法......任何帮助都会受到赞赏。
答案 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为每个产品结果获取一行。