Zbaczasz ze ścieżki, myśląc, że ma to związek z wieloma wierszami z połączenia. Problem jest z twoją logiką w klauzuli WHERE. Nie mówisz, czego chcesz pod względem dat, więc nie można wiedzieć, jakie powinno być rozwiązanie.
Uprościłem się do patrzenia na tabelę rezerwacji. Dostaję dwa rzędy, w których oczekujesz tylko jednego. Wszystko, co musisz zrobić, to wymyślić warunek, którego naprawdę chcesz.
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)