Bạn đang đi chệch hướng khi nghĩ rằng điều này phải làm với nhiều hàng từ sự tham gia. Vấn đề là với logic của bạn trong mệnh đề WHERE. Bạn không nói những gì bạn muốn về ngày tháng, vì vậy không thể biết giải pháp nên là gì.
Tôi đã đơn giản hóa xuống chỉ nhìn vào bảng đặt phòng. Tôi nhận được hai hàng mà bạn chỉ mong đợi một. Tất cả những gì bạn cần làm là tìm ra điều kiện mà bạn thực sự muốn.
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)