[英]PHP Laravel find a difference between 2 Query Builder
我想找到從查詢生成器獲得的 2 個值之間的差異。 獲得的價值必須在正確的校區和月份內。 我想查找上一個日期值、當前日期值和下一個日期值。 之后,找到差異當前值 - 先前值(將其命名為用法)。 問題是,當我 foreach 查詢生成器時,它只為每個查詢顯示 1 個值而不是 2 個值。 請幫我。
$metercurr = DB::table('smt_meter_reading')
->join('smt_smart_meter', 'smt_meter_reading.smt_smart_meter_id', '=', 'smt_smart_meter.id')
->select(DB::raw('SUM(actual_generation) as total1', 'smt_meter_reading.id', 'smt_smart_meter.serial_number'))
->whereBetween('read_time',[$currDate, $nextDate])
->where('smt_smart_meter.campus_id', $bill->campus_id)
->groupBy('smt_meter_reading.smt_smart_meter_id')
->get();
$meterprev = DB::table('smt_meter_reading')
->join('smt_smart_meter', 'smt_meter_reading.smt_smart_meter_id', '=', 'smt_smart_meter.id')
->select(DB::raw('SUM(actual_generation) as total2', 'smt_smart_meter.serial_number'))
->whereBetween('read_time',[$prevDate, $currDate])
->where('smt_smart_meter.campus_id', $bill->campus_id)
->groupBy('smt_meter_reading.smt_smart_meter_id')
->get();
$metername = DB::table('smt_meter_reading')
->join('smt_smart_meter', 'smt_meter_reading.smt_smart_meter_id', '=', 'smt_smart_meter.id')
->select('smt_smart_meter.serial_number')
->where('smt_smart_meter.campus_id', $bill->campus_id)
->get();
$previous = 0;
$current = 0;
$usage = 0;
$serialno;
foreach ($meterprev as $data) {
$previous = $data->total2;
}
foreach ($metercurr as $data) {
$current = $data->total1;
}
foreach ($metername as $data) {
$serialno = $data->serial_number;
}
$usage = $current - $previous;
您將需要使用以下效果嵌套您的foreach
語句:
$usages = [];
foreach ($meterprev as $prevdata) {
foreach ($metercurr as $currdata) {
if ($prevdata->serial_number == $currdata->serial_number) {
$usages = ($prevdata->total2 - $currdata->total1);
}
}
}
或者只是使用以下內容進行原始查詢:
$sqlQuery = "
Select (second.total - first.total) as 'usage'
(
SELECT
'SUM(actual_generation) as total', 'smt_smart_meter.serial_number'
FROM
smt_meter_reading
JOIN
smt_smart_meter ON smt_smart_meter.id = smt_meter_reading.smt_smart_meter_id
WHERE
smt_smart_meter.campus_id = $campus_id AND
read_time BETWEEN CAST($prevdate AS DATE) AND CAST($currdate AS DATE)
GROUP BY
smt_meter_reading.smt_smart_meter_id
) as first,
(
SELECT
'SUM(actual_generation) as total', 'smt_smart_meter.serial_number'
FROM
smt_meter_reading
JOIN
smt_smart_meter ON smt_smart_meter.id = smt_meter_reading.smt_smart_meter_id
WHERE
smt_smart_meter.campus_id = $campus_id AND
read_time BETWEEN CAST($prevdate AS DATE) AND CAST($currdate AS DATE)
GROUP BY
smt_meter_reading.smt_smart_meter_id
) as second
WHERE
first.smt_smart_meter.serial_number = second.smt_smart_meter.serial_number
";
$result = DB::select(DB::raw($sqlQuery));
這應該為您提供一系列用法。 這可能會更有效地完成或使用 eloquent 但希望這會為您指明正確的方向。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.