SELECT
t.timeslots AS timeslots,
IF(COUNT(e_serviceA.id) > 0, 'blocked', null) AS service13,
IF(COUNT(e_serviceB.id) > 0, 'blocked', null) AS service2
FROM (
SELECT
DATE_ADD(DATE_ADD(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY), INTERVAL day.seq DAY), INTERVAL hour.seq HOUR) as timeslots
FROM
seq_0_to_30 AS day, seq_14_to_18 AS hour
) t
LEFT JOIN
events e_serviceA ON t.timeslots BETWEEN DATE_SUB(e_serviceA.start, INTERVAL 4 HOUR) AND DATE_ADD(e_serviceA.start, INTERVAL 59 MINUTE) AND e_serviceA.service=2
LEFT JOIN
events e_serviceB ON t.timeslots BETWEEN e_serviceB.start AND DATE_ADD(e_serviceB.start, INTERVAL 239 MINUTE) AND e_serviceB.service=2
GROUP BY
t.timeslots
HAVING
`service2` IS NULL AND timeslots NOT IN ( SELECT `start` FROM `events`)
ORDER BY
t.timeslots