Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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 基于结束日期的每月活动订阅?_Php_Mysql - Fatal编程技术网

Php 基于结束日期的每月活动订阅?

Php 基于结束日期的每月活动订阅?,php,mysql,Php,Mysql,//嗨,我有这张桌子 id price startDate endDate 1 200 2012-01-10 2012-03-15 2 250 2012-02-15 2012-03-18 3 100 2012-02-11 2012-02-20 4 260 2012-03-22 2012-04-15 我想得到的是每个月订阅的总收入,这样的输出是 201201 20

//嗨,我有这张桌子

id    price     startDate     endDate

1     200       2012-01-10   2012-03-15 
2     250       2012-02-15   2012-03-18 
3     100       2012-02-11   2012-02-20 
4     260       2012-03-22   2012-04-15 
我想得到的是每个月订阅的总收入,这样的输出是

201201    200
201202    550     //(250 + 200 + 100)
201203    710     //(260 + 200 + 250)
201204    260

我自己的解决方案是基于许多php循环和临时变量,但我认为必须有更好的方法?

使用聚合函数和分组方式:

SELECT SUM(price), endDate FROM table GROUP BY endDate;

我认为这样做是对的

SELECT YEAR(startDate)year, MONTH(startDate)month, SUM(price)price FROM table GROUP BY MONTH(startDate)

我将再试一次,但这将有多个查询:

$totalMonths = ($maxDateYear - $minDateYear) * 12 - $minDateMonth + $maxDateMonth;
$year = $minDateYear;
$month = $minDateMonth;
$st = $pdo->prepare("SELECT SUM(price) FROM table WHERE startDate < ? and endDate >= ?");

for ($i = 0; $i < $totalMonths; $i++) {
    $date1 = "$year-$month-01";
    if (++$month > 12) { $month = 1; $year++; }
    $date2 = "$year-$month-01";
    $st->execute(array($date2, $date1));
    echo "$date1: " . $st->fetchColumn();
}

好了,现在我只是从数据库中获取所有的平面订阅,没有任何SQL魔法,其余的都来自php,因为我不知道如何用mysq简化它,所以不知道从哪里开始。这只会给我订阅结束的一个月的总和,我需要在开始日期和结束日期之间的每个月将价格相加。如果我只有一个订阅价格:200 2012-01-01-2012-09-01,它需要每个月输出200。扩展该查询,一个简单的方法可能是使用这样的查询在月份之间循环。。。从startDate=>'2012-01-01'和endDate<'2012-02-01'的表格中选择SUMprice、endDate;您不能选择YEARstartDate,因为您已经用group by子句过滤掉了它。@FrancoisBullenger为什么我可以选择SUMprice和YEARstartDate?我不能选择?如果在查询中使用group by,则只能使用聚合函数和select子句中分组的列。其他一切都是不确定的。在您的情况下,YEARstartDate将是不明确的,因为您可以表示该组中所有行的任何startDate。@FrancoisBourgeo是的,但在这种情况下,我们可以这样做,因为所有的年/月都是相同的,唯一会改变的是日期,也是唯一我没有选择的日期。。。