iT邦幫忙

0

同一個 query 可以做判斷條件,如果找不到就去另一個資料表找?

$list = $pdo->query(
    "SELECT s.icon FROM `stock` as s 
    JOIN `order` as o ON o.order_id = s.order_id "
);

while ($row = mysqli_fetch_array($list)) {
    echo $row['icon'];
}

假設我的資料是在 stock ,
當 order「取消」時,我會把 stock 的資料刪除
並匯入到 stock_cancel 資料表去,
stock 和 stock_cancel 的欄位規則一樣
此時...
假設 stock 有 3筆,stock_cancel 有 1筆
但是我在同一個 $list query 中,我能否同時顯示 stock 的 icon 也能顯示那一筆被刪除(stock_cancel)的 icon 呢?在同一個 query?這是可以實現的嗎?

1
小魚
iT邦高手 1 級 ‧ 2019-02-19 13:46:23
最佳解答

應該直接在 stock 做記號就好了,
譬如說 valid = 1 就是有效訂單,
valid = 0 是無效訂單,
SELECT的時候再篩選valid就可以了.

這樣是給自己找麻煩,
而且資料量大的話,
對效率應該也會有不小的影響.

看更多先前的回應...收起先前的回應...
小松菜奈 iT邦研究生 3 級 ‧ 2019-02-19 13:48:17 檢舉

嗯,我以為把數據表分開會比較好⋯因為我統計報表都是依照 stock 去計算,報表也有需要統計「已取消」的庫存,我就會去 stock_cancel 找

小松菜奈 iT邦研究生 3 級 ‧ 2019-02-19 21:34:10 檢舉

但是遺忘了假設同樣的query,有正常訂單跟取消訂單時無法共同顯示⋯⋯

小魚 iT邦高手 1 級 ‧ 2019-02-20 11:23:14 檢舉

我不知道你現在年紀多大了,
假如你真的想學程式,
找個正職的工作比較實在,
如果純粹興趣的話,
也不用太認真 XD

小松菜奈 iT邦研究生 3 級 ‧ 2019-02-20 12:32:16 檢舉

如果是你會怎麼做呢
一樣一般或取消會都存在 stock ?
我是想到之後數量多的話就很可怕
我已經有一個資料表是快一百萬筆數據的

slime iT邦大師 1 級 ‧ 2019-02-20 17:03:18 檢舉

我覺得訂單檔只要一個, 用狀態來判斷, 狀態包括: 準備中, 已成立, 成立後作廢等.

然後訂單明細是另外一個檔, 如果有些預訂單或系統自動拋轉單, 再另外一個準備單檔.

這樣平常只要掃訂單檔加條件, 要加總才從篩選完的訂單再撈取明細來加總.

如果要分隔, 也是以年份比如超過兩年的訂單再一次搬, 不然一筆一筆搬反而讓主機一直刪除寫入再 purge 我覺得更慢.

3
暐翰
iT邦大師 1 級 ‧ 2019-02-19 13:03:38

使用union all

SELECT 'uncancel' status,s.icon FROM `stock` as s 
JOIN `order` as o ON o.order_id = s.order_id 
union all
SELECT 'cancel' status,s.icon FROM `stock_cancel` as s 
JOIN `order` as o ON o.order_id = s.order_id 

如果要加上條件篩選

SELECT 'uncancel' status,s.icon FROM `stock` as s 
JOIN `order` as o ON o.order_id = s.order_id 
where 你的邏輯
union all
SELECT 'cancel' status,s.icon FROM `stock_cancel` as s 
JOIN `order` as o ON o.order_id = s.order_id 
where 你的邏輯
0
浩瀚星空
iT邦大師 1 級 ‧ 2019-02-19 13:37:26

你的說明有點搞不太清楚。沒辦法很有效的給你答案。也可能是因為你的節構上怪怪的。
order 裏當是訂單才對。stock 因該是商品。
不明白的是為何會出現stock_cancel這個東西出來。

正常來說。如果訂單取消的情況下。理當order會存在取消的筆數才對。
不明白為何還需要一個stock_cancel表來記錄取消?

所以很難給你一定的正確答案就是了。

我要發表回答

立即登入回答