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

时间:2016-06-09 10:42:12

标签: mysql sql

我希望找到一种方法来显示今天取消预订的用户列表。

当用户取消预订时我的系统工作方式是将记录添加到取消表中并从预订表中删除记录。

目前我有

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,firstname,lastname 取消 - cancelationid,memberid,日期,时间,组号 预订 - bookingid,memberid,日期,时间,组编号

2 个答案:

答案 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

中是否存在同一成员的同一天的记录

答案 1 :(得分:0)

我会通过更改bookings表的表结构来解决这个问题。我只是向bookings添加一个名为isActive的新列,而不是在多个表中存储取消状态。创建预订时,此列将设置为1,删除后,该列将设置为0。此外,当预订恢复时,它将被设置为1。这是一种常见的技术,称为&#34; soft&#34;删除。它允许您逻辑删除记录而不实际删除它或将其移动到另一个表。稍后,您可以将陈旧的已删除预订存档到另一个表格。

这是表结构:

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