Je bent van de baan en denkt dat dit te maken heeft met meerdere rijen van de join. Het probleem is met uw logica in de WHERE-component. Je zegt niet wat je wilt in termen van de data, dus het is onmogelijk om te weten wat de oplossing zou moeten zijn.
Ik vereenvoudigde het tot alleen maar kijken naar de boekingstabel. Ik krijg de twee rijen waar je er maar één verwacht. Het enige dat u hoeft te doen, is de voorwaardelijke uitvinden die u echt wilt.
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)