我有两张表,时间表和 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','');
答案 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点再扩展一行,依此类推,尽可能在前面填写。然后可以将预订附加到这些行,并且没有预订的日期很容易找到。
遗憾的是,这不是一个快速或简单的解决方案。