mysql: список строк в таблице, на которые нет ссылок в другом - PullRequest
1 голос
/ 03 июля 2010

У меня есть две таблицы, расписание и lesson_booking они связаны через schedule_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')

ПРИМЕЧАНИЕ: есть и другиетаблицы, связанные с сотрудником, типом урока и т. д. Кроме того, имя_дня является таблицей для дней, т. е. понедельника, вторника, среды и т. д. В предложении where предусмотрено отображение только timteable записей указанного дня.* Любая помощь очень ценится.

Спасибо.

ОБНОВЛЕНИЕ:

Примечание. Вот два запроса.Первая содержит всю информацию, которую я хочу, но некоторую дополнительную. Вторая содержит информацию, которую я хочу исключить из первой.Как мне объединить эти два, чтобы получить только те данные, которые я хочу?Спасибо.

    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';

определения для урока по бронированию и расписания

    /*
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 ]

3 голосов
/ 03 июля 2010

Использование:

   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
0 голосов
/ 03 июля 2010

Я думаю, что был прав насчет твоей проблемы.Вы хотите найти даты, когда уроки не забронированы, да?Но единственные даты, которые появляются в базе данных, это те, когда есть заказы;это потому, что дата идет с бронированием, а не уроком.Я думаю, что вам нужна другая таблица, возможно, что-то вроде «available_lessons», которая расширяет запланированные уроки в реальные уроки;одна строка в расписании гласит: 9:00 утра четверга, и это будет расширено в имеющихся уроках до одной строки 9:00 8 июля, другой строки 9:00 15 июля и т. д., заполненной настолько далеко, насколько это необходимо.Затем к этим строкам можно прикрепить заказы, и даты, в которых они не были найдены, достаточно легко найти.

К сожалению, это не быстрое или простое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...