Php 当没有可用数据时,在MySQL记录集输出中填写最后一个已知值

Php 当没有可用数据时,在MySQL记录集输出中填写最后一个已知值,php,mysql,Php,Mysql,考虑以下三个表: daterange stocks companies ----------- ---------------------------------- ---------------- _date stock_id nyse_date open close stock_id name ----------- --------------------------------

考虑以下三个表:

daterange     stocks                               companies
-----------   ----------------------------------   ----------------
_date         stock_id  nyse_date   open   close   stock_id  name
-----------   ----------------------------------   ----------------
2011-03-11    1         2011-03-11  40.50  40.60   1         Alcoa
2011-03-12    1         2011-03-14  40.62  41.04   2         Apple
2011-03-13    1         2011-03-15  41.00  41.20   .           .
2011-03-14    1         2011-03-16  41.15  42.00   .           .
2011-03-15    1         2011-03-18  41.50  41.80   100       Xerox
2011-03-16
2011-03-17
2011-03-18
daterange包含2011年3月11日至9月1日之间的一组连续日期。在同一时期,股票包含100只股票的开盘和收盘价格信息。股票/公司在公司中

在2011年3月12日和2011年3月13日的周末以及2011年3月17日的节假日期间,没有可用的定价信息

我需要的是daterange中每个日期的开放和关闭定价信息列表。只要daterange中有一个_日期,并且股票中没有定价信息,就必须填写最后已知的定价信息

因此,对于美国铝业股票_id1,给定日期范围日期,输出必须为*=取自上次已知值:

stock_id _date       open   close 
---------------------------------
1        2011-03-11  40.50  40.60
1        2011-03-12  40.50  40.60 *
1        2011-03-13  40.50  40.60 *
1        2011-03-14  40.62  41.04
1        2011-03-15  41.00  41.20
1        2011-03-16  41.15  42.00
1        2011-03-17  41.15  42.00 *
1        2011-03-18  41.50  41.80
…实际上,在9月1日之前的所有日期之后,然后继续进行示例中未给出的股票id 2开盘和收盘

2        2011-03-11  10.11  10.15
2        2011-03-12  10.11  10.15 * 
2        2011-03-13  10.11  10.15 *
2        2011-03-14  10.20  10.24
.        .
.        .
在MySQL中有可能做到这一点吗?或者,我可以使用PHP从daterange下载日期,并循环浏览股票,在没有特定日期条目时填写。但我想MySQL会快得多


非常感谢您的帮助:-

我尝试过这个,它似乎能满足您的需要

SELECT DISTINCT 1 AS Stock_id, D._date, 
       (SELECT S2.Open From Stocks S2
        WHERE S2.Stock_id=1
          AND S2.nyse_date < DATE_ADD(D._date, INTERVAL 1 DAY) 
        ORDER BY S2.nyse_date DESC
        LIMIT 1) AS open,
       (SELECT S3.Close From Stocks S3
        WHERE S3.Stock_id=1
          AND S3.nyse_date < DATE_ADD(D._date, INTERVAL 1 DAY) 
        ORDER BY S3.nyse_date DESC
        LIMIT 1) AS close
FROM daterange D LEFT JOIN stocks S1 ON D._date=S1.nyse_date
ORDER BY D._date ;

谢谢你的回复,但由于我在SQL方面没有那么先进,这是MySQL语法吗?我不知道如何解释@TargetStockID…@Pr0no,对不起,我脑子里想的是SQL Server。我将语法更改为mySQL。@TargetStockID是您要查找的股票id的参数。它通常是从调用代码传递的。然而,我知道许多人只是将字符串连接在一起来构建他们的SQL。请注意,无论我在哪里有@TargetStockID,我都用“1”代替了stock_id。它的工作原理是,如果没有股票数据,它将正确地获取前一天的值。如果在记录集输出中,有库存数据可用的每个日期都有100条记录,那么它就不起作用了。我已经用示例输出更新了你的帖子,向你展示了我的意思。你知道吗?@Pr0no,我在第一行添加了不同的语句。我已经尝试了对你的样本数据,得到一个结果,每天的空白天填写从最近的信息可用。