Você está fora do caminho pensando que isso tem a ver com várias linhas da junção. O problema está na sua lógica na cláusula WHERE. Você não diz o que está querendo em termos de datas, então é impossível saber qual deve ser a solução.
Eu simplifiquei para apenas olhar para a tabela de reservas. Eu recebo as duas linhas onde você está esperando apenas uma. Tudo o que você precisa fazer é descobrir a condicional que você realmente deseja.
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)