Не сте на път да мислите, че това е свързано с множество редове от съединението. Проблемът е с вашата логика в клаузата WHERE. Вие не казвате какво искате по отношение на датите, така че е невъзможно да се знае какво трябва да бъде решението.
Опростих до просто гледане на масата за резервации. Получавам двата реда, където очаквате само един. Всичко, което трябва да направите, е да разберете условното условие, което наистина искате.
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)