iT邦幫忙

0

mysql select 問題

  • 分享至 

  • xImage

我希望要執行以下功能:

  1. 讓在查詢money時可以多回傳兩個欄位
    • balance
    • subject
      balance是依照cost欄位直接做加減(但如果subjectid為-1則保留前筆資料)
      subject是依照subjectid欄位去subject資料庫的no去查找
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架構圖如下
https://ithelp.ithome.com.tw/upload/images/20240525/20156959ilOhLwAWD3.png

這是能做到的嗎? 還是一定要用一般的程式碼實現(因為讓程式去跑會讓網站有點卡)
原程式如下

$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
]));
ckp6250 iT邦好手 1 級 ‧ 2024-05-26 12:52:09 檢舉
寫二個 mysql 的 function,

select *,
func_balance(cost , subjectid) AS balance,
func_subject(subjectid) AS subject
from xxx

大概是這樣吧,【不一定要用一般的程式碼實現】
ho0527 iT邦新手 5 級 ‧ 2024-05-26 21:41:03 檢舉
好感謝
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
chan15
iT邦新手 2 級 ‧ 2024-05-27 09:05:01

能在 ap 層做掉就在 ap 層做掉,讓 mysql 語法越乾淨越好,多利用正歸化透過 join 達成目標,盡量不要寫 stored procedure 或是 view,以後抽換資料庫或 migration 都很容易會遇到問題

我要發表回答

立即登入回答