Está equivocado al pensar que esto tiene que ver con varias filas de la unión. El problema está en su lógica en la cláusula WHERE. No dices lo que quieres en cuanto a las fechas, por lo que es imposible saber cuál debería ser la solución.
Simplifiqué a solo mirar la tabla de reservas. Obtengo las dos filas donde esperas solo una. Todo lo que necesitas hacer es descubrir el condicional que realmente quieres.
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)