Mysql 需要显示过去6个月复杂子查询的成本

Mysql 需要显示过去6个月复杂子查询的成本,mysql,select,Mysql,Select,我知道如何在单个查询中获得过去6个月的数据,但我有一个查询,可以从多个子查询中获得数据,我只需要显示过去6个月的数据 这是我目前的问题 SELECT `totalSales`,`totalPurchase`,`totalNetpay`,`totalPension`,`totalP32` FROM (SELECT SUM((`Unit_Cost`*`ExchangeRate`)*`Quantity`) AS `totalSales` FROM `salesinvoice_products` AS

我知道如何在单个查询中获得过去6个月的数据,但我有一个查询,可以从多个子查询中获得数据,我只需要显示过去6个月的数据

这是我目前的问题

SELECT `totalSales`,`totalPurchase`,`totalNetpay`,`totalPension`,`totalP32`
FROM
(SELECT SUM((`Unit_Cost`*`ExchangeRate`)*`Quantity`) AS `totalSales` FROM `salesinvoice_products` AS `prod`
LEFT JOIN `salesinvoice` AS `inv` on `prod`.`SalesInvoice_id`=`inv`.`SalesInvoice_id`) as `t1`,

(SELECT SUM((`InvoiceValue`*`ExchangeRate`)-`VATValue`) as `totalPurchase` FROM `purchaseinvoice`) as `t2`,

(SELECT SUM(`NetAmountPaid`) as `totalNetpay` FROM `payroll_netpay`) as `t3`,

(SELECT SUM(`totalAmountDue`) as `totalPension` FROM `payroll_pensionrecords`) as `t4`,

(SELECT SUM(`totalAmountDue`) as `totalP32` FROM `payroll_p32records`) as `t5`
如您所见,我有5个子查询。现在这个给了我输出 3122.0517192173.91120010019.007351.562231.43

然而,我想要的是从过去6个月里得到6条线路。然而,当我尝试这样做时,我得到了多行而不是6行。我想我必须以某种方式将他们分组

好的,现在我将向您展示我试图使其工作的代码

SELECT `InvoiceDate`,`totalSales`,`totalPurchase`,`totalNetpay`,`totalPension`,`totalP32`
FROM
(SELECT SUM((`Unit_Cost`*`ExchangeRate`)*`Quantity`) AS `totalSales`,`InvoiceDate` FROM `salesinvoice_products` AS `prod`
LEFT JOIN `salesinvoice` AS `inv` on `prod`.`SalesInvoice_id`=`inv`.`SalesInvoice_id`
WHERE (`InvoiceDate` < Now() and `InvoiceDate` > DATE_ADD(Now(), INTERVAL- 6 MONTH)) && `InvoiceType`>1
 GROUP BY MONTH(`InvoiceDate`)
) as `t1`,

(SELECT SUM((`InvoiceValue`*`ExchangeRate`)-`VATValue`) as `totalPurchase` FROM `purchaseinvoice`
WHERE (`InvoiceDate` < Now() and `InvoiceDate` > DATE_ADD(Now(), INTERVAL- 6 MONTH))
 GROUP BY MONTH(`InvoiceDate`)
) as `t2`,


(SELECT SUM(`NetAmountPaid`) as `totalNetpay` FROM `payroll_netpay`
 WHERE (`Date` < Now() and `Date` > DATE_ADD(Now(), INTERVAL- 6 MONTH))
  GROUP BY MONTH(`Date`)
) as `t3`,


(SELECT SUM(`totalAmountDue`) as `totalPension` FROM `payroll_pensionrecords`
 WHERE (`datePaid` < Now() and `datePaid` > DATE_ADD(Now(), INTERVAL- 6 MONTH))
  GROUP BY MONTH(`datePaid`)
 ) as `t4`,

(SELECT SUM(`totalAmountDue`) as `totalP32` FROM `payroll_p32records`
  WHERE (`datePaid` < Now() and `datePaid` > DATE_ADD(Now(), INTERVAL- 6 MONTH))
  GROUP BY MONTH(`datePaid`)
) as `t5`

这给了我一个月的数据,但对我最初的查询没有太大帮助,但我尝试了其他一些方法。

是的,我有一个有效的答案,但无论如何它都不是最好的解决方案。我真的很想用一个查询来回答我的问题,但我提出的唯一解决方案是使用php并循环mysql。是的,我知道这并不理想,但我需要尽快找到一个解决方案,尽管这不是最好的方法,但它确实有效。我会继续下去,看看我是否能找到一种只使用mysql就可以做到这一点的方法,但目前必须这样做

基本上我的查询是一次一个月。因此,我必须在php中增加月份,并重新运行所有6个月的查询

现在正在寻找更好的解决方案

$plArray = array();
for ($i = 0; $i <= 5; $i++):
    $month  = date("m", strtotime( date( 'Y-m-01' )." -$i months"));
    $query="SELECT IFNULL(`totalSales`,0)-IFNULL(`totalPurchase`,0)-(IFNULL(`totalNetpay`,0)+IFNULL(`totalP32`,0)+IFNULL(`totalPension`,0)) as `totalPL`";
    $query.="
    FROM (SELECT SUM((`Unit_Cost`*`ExchangeRate`)*`Quantity`) AS `totalSales` FROM `salesinvoice_products` AS `prod`
    LEFT JOIN `salesinvoice` AS `inv` on `prod`.`SalesInvoice_id`=`inv`.`SalesInvoice_id`
    WHERE MONTH(`InvoiceDate`)=?
    ) as `t1`,

    (SELECT SUM((`InvoiceValue`*`ExchangeRate`)-`VATValue`) as `totalPurchase` FROM `purchaseinvoice`
    WHERE MONTH(`InvoiceDate`)=?
    ) as `t2`,

    (SELECT SUM(`NetAmountPaid`) as `totalNetpay` FROM `payroll_netpay`
    WHERE MONTH(`Date`)=?
    ) as `t3`,

    (SELECT SUM(`totalAmountDue`) as `totalPension` FROM `payroll_pensionrecords`
    WHERE MONTH(`datePaid`)=?
    ) as `t4`,

    (SELECT SUM(`totalAmountDue`) as `totalP32` FROM `payroll_p32records`
    WHERE MONTH(`datePaid`)=?
    ) as `t5`";
    $stmt = $this->logon->db->prepare($query);
    $stmt->bind_param('iiiii',$month,$month,$month,$month,$month);
    $stmt->execute();
    $result = $this->functions->get_result($stmt);
    $plArray[] = array(
    'date' => date("Y-m", strtotime( date( 'Y-m-01' )." -$i months")),
    'total' => $result[0]['totalPL']
    );
endfor; 
$plArray=array();
对于($i=0;$i登录->数据库->准备($query);
$stmt->bind_参数('iiii',$month,$month,$month,$month,$month,$month);
$stmt->execute();
$result=$this->functions->get\u result($stmt);
$plArray[]=数组(
“日期”=>日期(“Y-m”,标准时间(日期(“Y-m-01”)。“-$i个月”),
'total'=>$result[0]['totalPL']
);
endfor;

荒谬。请看:很好,我已经阅读了整个页面,但在该页面上没有一次提到MCVE的含义,这是真正没有帮助的。至于显示create和insert,我在dbforge中构建数据库时没有使用它们,我已经用我的第二段代码展示了我迄今为止所做的最大努力。至于这些关系,它们不会产生任何差异上面代码中的引用。我上面的代码中应该有足够的信息来提供解决方案。最终可能会自己解决。也许你还没有真正阅读整页。@ThomasWilliams草莓创建并链接到这个问题的整个指南都是关于MCVE的。因为你的查询在语法上是正确的,所以只需do不返回预期的结果集,因此您应该提供一些示例数据,并解释您正在尝试实现的内容。以当前的形式,我不知道您在追求什么,从关闭和关闭投票来看,我不是唯一一个遇到此问题的人。您可以任意抨击草莓,但这不会让您走得更远ting回答。我想这很清楚我在追求什么。第一个查询给出了总数,但我想要过去6个月的总数。第二个mysql代码显示了我尝试过的内容,但显然不起作用。所有字段都在那里,任何人都可以看到。至于MCVE,我甚至不知道缩写词是什么。我已经阅读了那一整页它一次也没有告诉我它是什么。
$plArray = array();
for ($i = 0; $i <= 5; $i++):
    $month  = date("m", strtotime( date( 'Y-m-01' )." -$i months"));
    $query="SELECT IFNULL(`totalSales`,0)-IFNULL(`totalPurchase`,0)-(IFNULL(`totalNetpay`,0)+IFNULL(`totalP32`,0)+IFNULL(`totalPension`,0)) as `totalPL`";
    $query.="
    FROM (SELECT SUM((`Unit_Cost`*`ExchangeRate`)*`Quantity`) AS `totalSales` FROM `salesinvoice_products` AS `prod`
    LEFT JOIN `salesinvoice` AS `inv` on `prod`.`SalesInvoice_id`=`inv`.`SalesInvoice_id`
    WHERE MONTH(`InvoiceDate`)=?
    ) as `t1`,

    (SELECT SUM((`InvoiceValue`*`ExchangeRate`)-`VATValue`) as `totalPurchase` FROM `purchaseinvoice`
    WHERE MONTH(`InvoiceDate`)=?
    ) as `t2`,

    (SELECT SUM(`NetAmountPaid`) as `totalNetpay` FROM `payroll_netpay`
    WHERE MONTH(`Date`)=?
    ) as `t3`,

    (SELECT SUM(`totalAmountDue`) as `totalPension` FROM `payroll_pensionrecords`
    WHERE MONTH(`datePaid`)=?
    ) as `t4`,

    (SELECT SUM(`totalAmountDue`) as `totalP32` FROM `payroll_p32records`
    WHERE MONTH(`datePaid`)=?
    ) as `t5`";
    $stmt = $this->logon->db->prepare($query);
    $stmt->bind_param('iiiii',$month,$month,$month,$month,$month);
    $stmt->execute();
    $result = $this->functions->get_result($stmt);
    $plArray[] = array(
    'date' => date("Y-m", strtotime( date( 'Y-m-01' )." -$i months")),
    'total' => $result[0]['totalPL']
    );
endfor;