Du er på vej ved at tro, at dette har at gøre med flere rækker fra sammenføjningen. Problemet er din logik i WHERE-klausulen. Du siger ikke, hvad du ønsker i forhold til datoerne, så det er umuligt at vide, hvad løsningen skal være.
Jeg forenklede ned til bare at se på bookingbordet. Jeg får de to rækker, hvor du kun forventer én. Alt du skal gøre er at finde ud af den betingelse, du virkelig ønsker.
mysql> SELECT * FROM booking WHERE NOT(start <= '2018-07-23' AND end >= '2018-07-21');
+-----+------------+------------+-----------+
| uid | start | end | apartment |
+-----+------------+------------+-----------+
| 1 | 2018-07-18 | 2018-07-20 | 1 |
| 3 | 2018-07-18 | 2018-07-20 | 2 |
+-----+------------+------------+-----------+
2 rows in set (0.00 sec)