mysql:表中未在另一个中引用的行列表

时间:2010-07-03 14:15:15

标签: mysql join

我有两张表,时间表 lesson_booking ,这些表格通过 timetable_id 链接。

时间表表示指定日期(周一,周二等)的时间表条目,可在 lesson_booking

中选择并用于预订客户

我想要的是获取没有预订相关的时间表条目列表。(即找到空的timtables插槽)

我能做到这一点,但我的问题是在特定日期做这件事。我遇到了一些麻烦,因为日期在 lesson_booking 表中,我请求的条目没有指向 lesson_booking 的链接

这是我到目前为止所拥有的: 以下内容将返回所有空的时间表条目。我想只在指定日期这样做。

我有一种感觉,我需要修改左连接,但我不确定如何。

    SELECT 
        lesson_booking.booking_date,
        employee.employee_firstname, employee_lastname,
        TIME_FORMAT(start_time, '%l:%i %p') AS start_time,
        TIME_FORMAT(end_time, '%l:%i %p') AS end_time,
        lesson_type.lesson_type_name

FROM timetable
        LEFT JOIN lesson_booking ON lesson_booking.timetable_id = timetable.timetable_id
        JOIN employee ON timetable.employee_id = employee.employee_id
        JOIN lesson_type ON timetable.lesson_type_id = lesson_type.lesson_type_id
        JOIN day_name ON day_name.day_name_id = timetable.day_name_id
WHERE   ISNULL(lesson_booking_id)
    AND
    day_name = DATE_FORMAT('2010-7-5', '%W')

注意:还有其他表链接到员工,课程类型等。另外,day_name是天的表,即星期一,星期二,星期三等。哪个子句缩小以仅显示 timteable 条目指定的一天。

非常感谢任何帮助..

感谢。

更新:

注意:这是twi查询。第一个包含我想要的所有信息,但也有一些额外的信息。第二个包含我希望从第一个中排除的信息。如何将两者结合起来获得我想要的数据?感谢。

    SELECT
    timetable.*
FROM
    timetable
    JOIN day_name ON day_name.day_name_id = timetable.day_name_id
WHERE
    day_name = DATE_FORMAT('2010-7-5', '%W');

-- exclude the following result from the above result.
SELECT
    timetable.*
FROM
    lesson_booking
    JOIN timetable ON timetable.timetable_id = lesson_booking.timetable_id
WHERE
    booking_date = '2010-07-05';

lesson_booking 时间表

的定义
    /*
SQLyog Community- MySQL GUI v8.22 
MySQL - 5.1.30-community-log 
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;

create table `COLUMNS` (
    `Field` varchar (192),
    `Type` blob ,
    `Null` varchar (9),
    `Key` varchar (9),
    `Default` blob ,
    `Extra` varchar (81)
); 
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('lesson_booking_id','int(11)','NO','PRI',NULL,'auto_increment');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('client_id','int(11)','NO','MUL',NULL,'');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('timetable_id','int(11)','NO','MUL',NULL,'');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('horse_owned_id','int(11)','NO','MUL',NULL,'');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('transaction_id','int(11)','YES','MUL',NULL,'');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('booking_date','date','NO','',NULL,'');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('cancelled_status','int(11)','YES','MUL',NULL,'');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('no_show','tinyint(1)','NO','','0','');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('same_time_next_week_booking_id','int(11)','YES','MUL',NULL,'');

/*
SQLyog Community- MySQL GUI v8.22 
MySQL - 5.1.30-community-log 
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;

create table `COLUMNS` (
    `Field` varchar (192),
    `Type` blob ,
    `Null` varchar (9),
    `Key` varchar (9),
    `Default` blob ,
    `Extra` varchar (81)
); 
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('timetable_id','int(11)','NO','PRI',NULL,'auto_increment');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('day_name_id','int(11)','NO','MUL',NULL,'');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('start_time','time','NO','',NULL,'');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('end_time','time','NO','',NULL,'');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('lesson_type_id','int(11)','NO','MUL',NULL,'');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('employee_id','int(11)','NO','MUL','0','');
insert into `COLUMNS` (`Field`, `Type`, `Null`, `Key`, `Default`, `Extra`) values('timetable_active_status','tinyint(1)','NO','','1','');

2 个答案:

答案 0 :(得分:3)

使用:

   SELECT tt.*
     FROM TIMETABLE tt
     JOIN day_name dn ON dn.day_name_id = ttt.day_name_id
                     AND dn.day_name = DATE_FORMAT('2010-7-5', '%W');
LEFT JOIN LESSON_BOOKING lb ON lb.timetable_id = tt.timetable_id
                           AND lb.booking_date = '2010-07-05'
    WHERE lb.lesson_booking_id IS NULL

答案 1 :(得分:0)

我认为我对你的问题是正确的。你想找到没有预订课程的日期,是吗?但是,数据库中出现的唯一日期是预订时的日期;那是因为日期与预订不同而不是课程。我认为你需要另一张桌子,或许像'available_lessons'这样的桌子,将时间表课程扩展到实际课程中;时间表中的一行说,星期四上午9点,这将在7月8日上午9点的可用_Nonons扩展到一行,7月15日上午9点再扩展一行,依此类推,尽可能在前面填写。然后可以将预订附加到这些行,并且没有预订的日期很容易找到。

遗憾的是,这不是一个快速或简单的解决方案。