2016-06-09 112 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看起来很有前途,但是当你发现自己编写复杂的查询来回答简单的业务问题时,可能需要考虑架构。

相关问题