一個MySQL多表查詢的問題

木頭印象發表於2020-12-23

餐廳訂餐與用餐資料分析時遇到一個多表查詢問題,經過多方面請教,獲得了兩種解決方法,特此記錄下來

有三個MySQL資料表,表一:訂餐情況表tb_order,表二:消費流水錶tb_expend,表三:人員表tb_user

消費流水錶tb_expend

在這裡插入圖片描述

訂餐情況表tb_order

在這裡插入圖片描述
訂餐情況表tb_order說明:breakfast早餐訂餐情況,lunch午餐訂餐情況,值為1表示已訂餐,值為零或者沒有記錄表示未訂餐。Orderdate表示是訂的是哪一天的早餐午餐。
消費流水錶tb_expend:expens 消費金額。消費金額為5,表示去餐廳消費用過早餐,消費金額為20表示去餐廳消費用過午餐,expensdate是消費的日期。

想查詢幾種情況

查詢一:查詢出一週內所有預訂了午餐,但是沒有去餐廳用過午餐的人員,
查詢二:查詢出一週內所有去餐廳用過早餐,但是沒有預訂過早餐的人員

1 難點 ,例如查詢一:如何查詢出一週內所有預訂了午餐,但是”沒有“去餐廳用過午餐的人員,
這個問題有個關鍵因素是,lunch=1的時候,breakfast也有可能=1,因此expend=5的時候,並不一定是在結果裡面的。因為expend=5對應了breakfast=1的情況。
訂餐記錄是一條中包括了早餐和午餐的訂餐情況,兩個資訊
消費記錄一條中只包含一個資訊,消費是5元的話,說明去吃了早飯,消費是20元的話,說明是去吃了午飯,所以如果去吃了早飯+午飯的話,消費記錄會有兩條記錄,如果某一天早餐午餐都沒吃的話,就沒有這一天的消費記錄。
所以消費記錄要麼是沒有,要麼是expenses=5,要麼是expenses=20;

方法一(感謝ZJReason提供)

查詢一: 訂了午餐,沒來吃的人
SELECT * FROM tb_order a
LEFT JOIN tb_expend b ON (b.username=a.username AND b.expensdate =a.orderdate AND b.expens=20)
WHERE a.lunch=1 AND b.id IS NULL AND (a.orderdate BETWEEN ‘2020-11-1’ AND ‘2020-11-2’)

查詢二: 吃了早餐,沒有訂餐的人
SELECT * FROM tb_expend a
LEFT JOIN tb_order b ON (b.userid=a.userid AND b.orderdate=a.expensdate AND b.breakfast=1)
WHERE a.expens=5 AND b.id IS NULL AND (a.expensdate BETWEEN ‘2020/11/1’ AND ‘2020/11/2’)

方法二(感謝lxl8611提供)

查詢一: 訂了午餐,沒來吃的人
select * from tb_order a where lunch=1 and not exists(select 1 from tb_expend b where a.userid=b.userid and a.orderdate=b.expensdate and expens=20 ) ORDER by orderdate
查詢二: 吃了早餐,沒有訂餐的人
select * from tb_expend a where expens=5 and not exists(select 1 from tb_order b where a.userid=b.userid and a.expensdate=b.orderdate and breakfast=1)AND a.expensdate >=‘2020/11/1’ AND a.expensdate <=‘2020/11/2’ ORDER BY expensdate

根據實際情況修改了一點,原答案使用“date(orderdate)>= date(date_add(now(),INTERVAL -7 DAY))”語句來處理時間,先記錄下來找個時間學習一下用法。

相關文章