2016-06-09 108 views
2

我正在尋找一種方法來顯示今天取消預訂的用戶列表。如何從兩個表中獲取不存在的第三個表中的所有記錄

我的系統在用戶取消預訂時的工作方式是將記錄添加到取消表中,並從預訂表中刪除記錄。

目前我有

select distinct 
members.firstname, members.lastname, cancelations.time, cancelations.groupnumber 
from 
members inner join cancelations on members.memberid = cancelations.memberid 
where 
cancelations.date = "CURRENT_DATE" 

這工作完全正常,但,這也將表明,如果用戶移動他們的任命到更高/較早的時間作爲系統將取消,然後重新本書。

所以我相信我會需要的是這樣的:

其中cancelations.date =「CURRENT_DATE」和其中用戶已經不在有任何記錄選擇不同列名今天預訂表

表在使用中(簡體)

成員 - MEMBERID,名字,姓氏 取消指令 - cancelationid,MEM berid,日期,時間,groupnumber 預訂 - bookingid,MEMBERID,日期,時間,groupnumber

+0

如果重新預約是爲了明天,該怎麼辦? – Shadow

+0

客戶會將此視爲取消,但好點! –

回答

1

因此,使用NOT EXISTS()這是你問什麼了:

select distinct members.firstname, members.lastname, cancelations.time, cancelations.groupnumber 
from members 
inner join cancelations 
    on members.memberid = cancelations.memberid 
where cancelations.date = "CURRENT_DATE" 
    AND NOT EXISTS(SELECT 1 FROM bookings b 
       WHERE DATE(b.dateField) = DATE(cancelations.date) 
        AND b.memberid = member.memberid) 

這就驗證了在同一個記錄日同一個成員不存在booking

+0

嗨Sagi,我已經在b.datefield和member [s] .memberid中替換了正確的列,但是這不起作用,只是在條件爲true和false時導致沒有結果 –

+0

使用select distinct.firstname固定, members.lastname,cancellations.time,取消。groupnumber 從成員 內上members.memberid = cancelations.memberid 其中cancelations.date = CURRENT_DATE 加入取消指令 AND NOT EXISTS(SELECT * FROM預訂b WHERE b.date = CURRENT_DATE AND b.memberid = members.memberid ) –

0

我會去改變你的表結構爲bookings表。而不是在多個表中存儲取消的狀態,我只需在bookings中添加一個新列即isActive。當預訂創建時,此列將被設置爲1,並且在刪除一個時將設置爲0。另外,當預訂恢復時,它將被設置爲1。這是一種常見的稱爲「軟」刪除的技術。它允許您在邏輯上刪除記錄而不實際刪除記錄或將其移動到另一個表。稍後,您可以將陳舊刪除的預訂歸檔到另一個表格中。

這裏是表結構:

CREATE TABLE bookings (`id` int PRIMARY KEY, 
         `memberid` int, 
         `isActive` tinyint 
         `date` datetime); 

現在查詢發現如果用戶沒有任何預訂從今天起是明智而又簡單:

SELECT COUNT(*) 
FROM bookings 
WHERE memberid = 1 AND 
     date = CURDATE() AND 
     isActive = 1 

查詢通過@給sagi看起來很有前途,但是當你發現自己編寫複雜的查詢來回答簡單的業務問題時,可能需要考慮架構。

相關問題