我希望要執行以下功能:
SELECT
m.*,
(SELECT SUM(cost)
FROM `money`
WHERE id <= m.id AND (date LIKE ?) AND deletetime = '' AND type = ?) AS `balance`,
s.no AS `subject`
FROM `money` m
LEFT JOIN `subject` s ON m.subjectid = s.id
WHERE (m.date LIKE ?) AND m.deletetime = '' AND m.type = ?
ORDER BY m.id
db架構圖如下
這是能做到的嗎? 還是一定要用一般的程式碼實現(因為讓程式去跑會讓網站有點卡)
原程式如下
$row=query($db,"SELECT*FROM `money` WHERE (`date` LIKE ?) AND `deletetime`='' AND `type`=?",[$_GET["year"]."%",$_GET["type"]]);
$data=[];
$balance=0;
for($i=0;$i<count($row);$i=$i+1){
if($row[$i]["subjectid"]!=-1)
$balance=$balance+$row[$i]["cost"];
$data[]=[
"id"=>$row[$i]["id"],
"subject"=>query($db,"SELECT*FROM `subject` WHERE `id`=?",[$row[$i]["subjectid"]])[0]["no"]??-1,
"subjectid"=>$row[$i]["subjectid"],
"no"=>$row[$i]["no"],
"type"=>$row[$i]["type"],
"name"=>$row[$i]["name"],
"description"=>$row[$i]["description"],
"cost"=>$row[$i]["cost"],
"costtype"=>$row[$i]["costtype"],
"status"=>$row[$i]["status"],
"date"=>$row[$i]["date"],
"balance"=>$balance,
"updatetime"=>$row[$i]["updatetime"]
];
}
$data=array_reverse($data);
echo(json_encode([
"success"=>true,
"data"=>$data
]));
能在 ap 層做掉就在 ap 層做掉,讓 mysql 語法越乾淨越好,多利用正歸化透過 join 達成目標,盡量不要寫 stored procedure 或是 view,以後抽換資料庫或 migration 都很容易會遇到問題