У меня есть простая система бронирования для тестирования портативных компьютеров с 6 ноутбуками, названными Laptop01 до 06, у каждого из которых есть три выделенных временных интервала.
Пользователь может выбрать эти временные интервалы, если слот не зарезервирован илиесли бронирование было отменено / отклонено.
Пока у меня есть рабочий код, я обнаружил фатальную ошибку, которая приводит к дублированию отмененного / отклоненного слота.
Позвольте мне объяснить ...

event_information
- содержит информацию о событии бронирования (для этого примера требуется только идентификатор) event_machine_time
- Здесь хранятся все ноутбуки, по три ряда на каждый ноутбук с уникальными временными интервалами, доступными на выбор event_booking
- Здесь хранится фактическое бронирование, которое затем ссылается на другую базу данных кандидатов, не включенную здесь
Затем я запускаю простой запрос, который объединяет все вместе и (я думал) идентифицирует зарезервированные события:
SELECT machine_laptop, machine_name, B.id AS m_id, C.id AS c_id, C.confirmed AS c_confirmed, C.live AS c_live,
(C.id IS NOT NULL AND C.confirmed !=2 AND C.live !=0) AS booked
FROM event_information A
INNER JOIN event_machine_time B ON ( 1 =1 )
LEFT JOIN event_booking C on (B.id = C.machine_time_id and A.id = C.information_id )
WHERE A.id = :id
ORDER BY `B`.`id` DESC
booked
проверяет, является ли confirmed
не 2 -что означает, что бронирование былоОтменено / отклонено (0 - не подтверждено, 1 - подтверждено) и live
проверяет удаление (0 - удалено, 1 - не удалено).
Однако, если лицо удаляется (live
-0) или отменяет / отклоняет (confirmed
- 2), затем в моем раскрывающемся списке выбора слотов переднего плана будет добавлен дополнительный слот, поскольку столбец booked
по-прежнему равен 0, как показано ниже:

Это позволяет пользователю затем выбрать один из двух слотов одновременно, что означает двойное бронирование.
Теперь я знаю, что использование соединения - это не то, что нужноделать, и я предполагаю, что мне нужно запустить подзапрос, но я не эксперт по SQL, и я хотел бы получить некоторую помощь, чтобы найти примеры подобных «вторых запросов», из которых я могу извлечь уроки.
Также извиняюсь, если моя терминология неверна.
РЕДАКТИРОВАТЬ:
По запросу я включил вывод:

Второе редактирование и заключение:
В конце концов мне удалось создать решение вместеподпишите подзапрос, чтобы удалить отмененные / отклоненные заказы перед выводом, а затем используйте Group By, чтобы отобразить только один из каждого времени.Скорее всего, это не лучший способ, но он сработал для меня.
SELECT machine_laptop, machine_name, B.id AS m_id, C.id AS c_id, C.confirmed AS c_confirmed, C.live AS c_live, B.start_time AS b_start_time, (
C.id IS NOT NULL
AND C.confirmed !=2
AND C.live !=0
) AS booked
FROM event_information A
INNER JOIN event_machine_time B ON (1=1)
LEFT JOIN (SELECT * FROM event_booking WHERE confirmed <> '2' AND live <> '0') AS C ON ( B.id = C.machine_time_id AND A.id = C.information_id )
WHERE A.id = :id
GROUP BY m_id
ORDER BY machine_name ASC, b_start_time ASC
Спасибо за ваш вклад.