Vous êtes hors piste en pensant que cela a à voir avec plusieurs lignes de la jointure. Le problème vient de votre logique dans la clause WHERE. Vous ne dites pas ce que vous voulez en termes de dates, il est donc impossible de savoir quelle devrait être la solution.
J'ai simplifié en regardant simplement le tableau de réservation. J'obtiens les deux lignes où vous n'attendez qu'une seule. Tout ce que vous avez à faire est de déterminer le conditionnel que vous voulez vraiment.
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)