Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL-根据日期范围获取最低价格_Php_Mysql - Fatal编程技术网

Php SQL-根据日期范围获取最低价格

Php SQL-根据日期范围获取最低价格,php,mysql,Php,Mysql,我有一个数据库,包含同一产品不同供应商的价格。每个供应商/产品组合都有一个带有产品ID和价格的开始和结束日期 id | pid | aid | start_date | end_date | price 1 | 1 | 1 | 2017-01-01 | 2017-01-10 | 10.00 1 | 1 | 2 | 2017-01-01 | 2017-01-05 | 12.00 1 | 1 | 2 | 2017-01-06 | 2017-01-09 | 9.00 我

我有一个数据库,包含同一产品不同供应商的价格。每个供应商/产品组合都有一个带有产品ID和价格的开始和结束日期

id | pid | aid | start_date | end_date | price
1  | 1   |  1  | 2017-01-01 | 2017-01-10 | 10.00
1  | 1   |  2  | 2017-01-01 | 2017-01-05 | 12.00
1  | 1   |  2  | 2017-01-06 | 2017-01-09 | 9.00
我使用日历表来确保我有一定范围内的所有日期。 我所面临的困难是选择给定日期范围的最低价格。以上数据应输出如下

date       | aid | price
2017-01-01 | 1   | 10.00
2017-01-02 | 1   | 10.00
2017-01-03 | 1   | 10.00
2017-01-04 | 1   | 10.00
2017-01-05 | 1   | 10.00
2017-01-06 | 2   |  9.00
2017-01-07 | 2   |  9.00
2017-01-08 | 2   |  9.00
2017-01-09 | 2   |  9.00
2017-01-10 | 1   | 10.00
仅仅拥有一个供应商并获得价格不是问题,但一旦我开始对数据进行分组,我只会得到一个结果或一个不正确的结果。 我使用的是这个查询,它提供了错误的结果

SELECT 
    c.date, min(p.price) as min_price 
FROM 
    bricks_calender c 
LEFT JOIN 
    bricks_prijzen p ON c.date BETWEEN p.start_date AND p.end_date
WHERE 
    p.pid = 1 
GROUP BY 
    aid 
ORDER BY 
    c.date

有什么建议我需要更新此查询以获得预期结果吗?或者我应该改变我的数据模型(这当然不是首选)

我认为这仅仅是因为您将数据按
aid
group by aid
分组,所以您的行数不能超过存在的不同
aid
的数量


通过按取消设置此
组,是否解决了问题?

如果砖块日历每个日期包含一行,则以下操作应有效:

SELECT 
    c.`date`, 
    (select s.`aid` from `bricks_prijzen` s where s.`price` = min(p.`price`) and c.`date` BETWEEN s.`start_date` AND s.`end_date` ORDER BY s.`price` ASC LIMIT 0,1) AS `aid`,
    min(p.`price`) as `min_price`
FROM `bricks_calender` c
LEFT JOIN `bricks_prijzen` p
    ON c.`date` BETWEEN p.`start_date` AND p.`end_date`
WHERE 
    p.`pid` = 1 
GROUP BY 
    c.`date`
ORDER BY 
    c.`date`;

使用分组帮助和date@RavinderReddy按
aid
date
进行分组将得到与日历表完全相同的结果,因为他的日期都是different@Ralf,您是否可以将收到的信息作为查询的“不正确”输出提供?为了获得所需的结果,您需要另一个表,每个日期一行。这可以通过存储过程中的临时表或php代码来完成。然后,您可以将其与问题中的表连接起来,并在价格上使用min()列出每个日期的最低价格。我为您摆弄了这个:。正如预期的那样,上面的查询将输出两行,一行用于10.00,一行用于9.00,那么您的预期结果是什么?您希望它如何被代表?谢谢您的建议。有两个问题,表bricks_prijzen中不存在s.date字段。此表包含开始和结束日期字段。将“s.
date
=c.
date
”部分更改为“s.start\u date和s.end\u date之间的c.date”,我会收到一条错误消息“注释不同步”。还有其他建议吗?我已经更新了代码。很抱歉。我第一次就应该知道。至于错误消息,您确定是“注释不同步”而不是“命令不同步”?@Ralf:我创建了一个SQL FIDLE来测试该语句: