Untitled

 avatar
unknown
php_laravel_blade
a year ago
1.4 kB
4
Indexable
SELECT
    r.id AS room_id,
    s.start_time AS start,
    IFNULL(TIME(MIN(b.date_from)), s.end_time) AS end
FROM
    rooms r
JOIN
    schedules s ON r.id = s.room_id AND s.day_of_week = DAYOFWEEK(:date1) - 1
LEFT JOIN
    bookings b ON r.id = b.room_id AND DATE(b.date_from) = :date1 AND b.status NOT IN ($status)
GROUP BY
    r.id, s.start_time, s.end_time
HAVING
    TIMEDIFF(end, start) >= '01:00:00'

UNION

SELECT
    b1.room_id,
    TIME(b1.date_to) AS start,
    (
        SELECT
            TIME(MIN(b2.date_from))
        FROM
            bookings b2
        WHERE
            b2.status NOT IN ($status)
            AND DATE(b2.date_from) = DATE(b1.date_to)
            AND b2.date_from >= b1.date_to
            AND b1.room_id = b2.room_id
    ) AS end
FROM
    bookings b1
WHERE
    DATE(b1.date_from) = :date2 AND b1.status NOT IN ($status)
HAVING
    start IS NOT NULL
    AND end IS NOT NULL
    AND TIMEDIFF(end, start) >= '01:00:00'

UNION

SELECT
    r.id AS room_id,
    IF(
        COUNT(b.date_from) = 0,
        s.end_time,
        TIME(MAX(b.date_to))
    ) AS start,
    s.end_time AS end
FROM
    rooms r
JOIN
    schedules s ON r.id = s.room_id AND s.day_of_week = DAYOFWEEK(:date3) - 1
LEFT JOIN
    bookings b ON r.id = b.room_id AND DATE(b.date_from) = :date3 AND b.status NOT IN ($status)
GROUP BY
    r.id, s.start_time, s.end_time
HAVING
    TIMEDIFF(end, start) >= '01:00:00'
Editor is loading...
Leave a Comment