MySQL-返回所有没有预订的人?

MySQL-返回所有没有预订的人?,mysql,Mysql,我试图让MySQL将在某个时间没有预约的所有讲师返回给我。这个查询本质上就是搜索查询。因此,返回所有尚未预订的讲师及其详细信息。有人能帮我完成吗 SELECT AddressTypes.AddressTypeName, Addresses.*, InstructorSettings.*, Users.*, BookedSlots.DateTime FROM Users LEFT OUTER JOIN InstructorSettings ON Users.User

我试图让MySQL将在某个时间没有预约的所有讲师返回给我。这个查询本质上就是搜索查询。因此,返回所有尚未预订的讲师及其详细信息。有人能帮我完成吗

SELECT
  AddressTypes.AddressTypeName,
  Addresses.*,
  InstructorSettings.*,
  Users.*,
  BookedSlots.DateTime
FROM Users
  LEFT OUTER JOIN InstructorSettings
    ON Users.UserID = InstructorSettings.UserID
  LEFT OUTER JOIN Addresses
    ON Users.UserID = Addresses.UserID
  INNER JOIN AddressTypes
    ON Addresses.AddressTypeID = AddressTypes.AddressTypeID
  LEFT OUTER JOIN BookedSlots
    ON Users.UserID = BookedSlots.UserID
WHERE Users.AccountTYpe = 3 AND Addresses.PostCode1 IN ('l13') AND BookedSlots.DateTime <> '2013-04-25 11:00:00'
上面的查询没有返回任何内容,但如果我取出和BookedSlots.DateTime“2013-04-25 11:00:00”,它将返回所有讲师详细信息

数据库


在我看来,您所寻找的似乎是BookedSlot中在指定时间内缺少记录

我不确定这是否被认为是MySQL的最佳实践,但我通常不是通过连接来完成这项任务,而是通过一个子选择或临时表来完成,如下所示:

SELECT
  AddressTypes.AddressTypeName,
  Addresses.*,
  InstructorSettings.*,
  Users.*,
FROM Users
  LEFT OUTER JOIN InstructorSettings
    ON Users.UserID = InstructorSettings.UserID
  LEFT OUTER JOIN Addresses
    ON Users.UserID = Addresses.UserID
  INNER JOIN AddressTypes
    ON Addresses.AddressTypeID = AddressTypes.AddressTypeID
WHERE Users.AccountType = 3 AND Addresses.PostCode1 IN ('l13') 
AND Users.UserID not in (SELECT BookedSlots.InstructorID FROM BookedSlots 
     WHERE BookedSlots.DateTime = '2013-04-25 11:00:00')

编辑:根据注释,将select语句更改为排除BookedSlot,并将sub select语句更改为返回与预订中的讲师而不是学生匹配的讲师ID。

要检查特定时间段上是否没有任何预订,在联接条件中包括时隙,并选择时隙id为null的位置-如下所示:

SELECT
  AddressTypes.AddressTypeName,
  Addresses.*,
  InstructorSettings.*,
  Users.*,
  BookedSlots.DateTime
FROM Users
  LEFT OUTER JOIN InstructorSettings
    ON Users.UserID = InstructorSettings.UserID
  LEFT OUTER JOIN Addresses
    ON Users.UserID = Addresses.UserID
  INNER JOIN AddressTypes
    ON Addresses.AddressTypeID = AddressTypes.AddressTypeID
  LEFT OUTER JOIN BookedSlots
    ON Users.UserID = BookedSlots.UserID AND 
                      BookedSlots.DateTime = '2013-04-25 11:00:00'
WHERE Users.AccountTYpe = 3 AND 
      Addresses.PostCode1 IN ('l13') AND 
      BookedSlots.UserID is null

BookedSlots.DateTime中是否有不为空且不是“2013-04-25 11:00:00”的数据?这里有很多详细信息,非常有用+1.如果你想让人们更容易回答问题,请考虑添加一个SQLFiddle示例来进行分叉。对于BookDSLoop.DATETIME,如果一个人注册了该类,他们是否都为你感兴趣的特定日期打上了EX:11:00的时间戳?请确认一下。你真的在问我吗?我想要一份2013-04-25年有问题日期的所有讲师的名单,他们没有任何人注册参加11:00:00的课程。他们可能会在12:30、1:00、2:00,无论什么时段被占用,但在11:00时段却没有。您好,这看起来像是我在寻找的内容,但phpMyAdmin返回:1051-未知表“用户”。非常感谢您的时间。这是一个奇怪的错误,因为您有一个用户表,对吗?我试着稍微编辑一下我的答案,也许再试试?嗨,这次我在“字段列表”中得到了1054个未知列“BookedSlots.DateTime”。是的,有一个用户表,可以在上面的链接中看到这些字段。非常感谢您的帮助。有趣的是,您的解析器似乎不喜欢表的昵称。。。再次编辑,报告结果:Hi Will,仍然得到相同的错误。我试着用dbForge来分析它,它说第6行有个错误,未知标识符。我删除了第6行BookedSlots.DateTime,并让软件重新添加它,它将FROM部分更改为FROM BookedSlots,Users。然后我运行了这个查询,它返回了讲师,尽管他们已经预订了那个日期和时间:S.Hi Mark,非常感谢您的帮助。不幸的是,即使讲师确实预订了上述日期/时间,它也返回了讲师。我尝试将其更改为BookedSlots.DateTime“2013-04-25 11:00:00”,但没有任何效果。@user2317376:我刚刚注意到,您现有的查询和我的修订版本是基于查找在2013-04-25 11:00:00没有预订的用户,而不是讲师。你们有讲师表吗?如果是这样,它不会出现在现有查询或数据库关系图中。