これは結合からの複数の行に関係していると考えているので、軌道に乗っていません。問題は、WHERE句のロジックにあります。あなたは日付に関してあなたが何を望んでいるのかを言わないので、解決策がどうあるべきかを知ることは不可能です。
私は単純化して予約テーブルを見るだけにしました。私はあなたが1つだけを期待している2つの行を取得します。あなたがする必要があるのはあなたが本当に欲しい条件を理解することです。
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)