Mysql 如何从第三个表中不存在的两个表中获取所有记录

Mysql 如何从第三个表中不存在的两个表中获取所有记录,mysql,sql,Mysql,Sql,我正在寻找一种方法来显示今天取消预订的用户列表 当用户取消预订时,我的系统的工作方式是在取消表中添加一条记录,然后从预订表中删除该记录 目前我有 select distinct members.firstname, members.lastname, cancelations.time, cancelations.groupnumber from members inner join cancelations on members.memberid = cancelations.membe

我正在寻找一种方法来显示今天取消预订的用户列表

当用户取消预订时,我的系统的工作方式是在取消表中添加一条记录,然后从预订表中删除该记录

目前我有

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=当前_日期且用户今天在bookings表中没有任何记录的表中选择不同的列名

使用中的表格简化

成员-成员ID、名字、姓氏 取消-取消ID、成员ID、日期、时间、组号 bookings-bookingid、memberid、日期、时间、组号

所以使用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) 

这将检查预订表中是否不存在同一成员当天的记录

我将通过更改预订表的表结构来实现这一点。我不想在多个表中存储取消状态,而只想在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给出的查询看起来很有希望,但当你发现自己编写复杂的查询来回答简单的业务问题时,考虑一下架构可能会有所收获。

如果重新预订的约会是明天的,那该怎么办?客户会将其归类为取消,尽管这一点很好!您好,Sagi,我已在b.datefield和member[s]中替换了正确的列。memberid但是这不起作用,当条件为true和falsefixed时,它只会导致没有结果,并选择了不同的成员。firstname,members.lastname,cancelations.time,cancelations.groupnumber来自成员内部加入成员的取消。memberid=cancelations.memberid其中cancelations.date=当前\日期且不存在从预订b中选择*,其中b.date=当前\日期,b.memberid=members.memberid