我有两个表一个用于房间,另一个用于房间状态,其中包含房间的状态,如果忙或不,现在我有这个sql检查房间表中的所有房间但只返回那些房间的结果在room_status表中是免费的
$results=DB::select( DB::raw("SELECT r.room_id,r.room_no,r.description,r.path,r.room_photo,r.price,r.free_services,s.is_free FROM rooms r,roomstatus s
WHERE r.room_id NOT IN ( SELECT b.room_id FROM roomstatus b
WHERE NOT ( b.end_datetime < :start_date OR b.start_datetime > :end_date ) ) OR is_free=1
ORDER BY r.room_id"),array('start_date'=>$start_date,'end_date'=>$end_date));
问题是如果查询没有返回任何房间,如果它的id不在room_status表中,我希望它检查房间表中的所有房间,如果他们的通信ID不在room_status表中,或者他们的id是在room_status表并标记为免费
答案 0 :(得分:2)
您可以像这样使用左连接:
$results = db :: SELECT
(
db :: raw (
"SELECT
r.room_id,r.room_no,r.description,r.path,r.room_photo,r.price,r.free_services,s.is_free
FROM rooms r
LEFT JOIN roomstatus s
WHERE s.is_free = 1 OR s.is_free is null
ORDER BY r.room_id"
)
);
如果有必要,您可以在此基础上添加开始日期和结束日期。
答案 1 :(得分:1)
完成您要做的事情的一种更简单的方法是在表格上执行连接。
的内容
$results = db :: SELECT
(
db :: raw (
"
SELECT r.room_id, r.room_no, r.description, r.path, r.room_photo, r.price,
r.free_services, s.is_free
from rooms r left join roomstatus s
on (s.room_id = r.room_id)
where s.room_id is null or s.is_free = 1
"));
此查询将返回没有状态的所有房间(状态表中不存在记录)或is_free标志设置为true的房间。这里的关键是使用左连接,这样就可以包含房间表中的所有记录,无论状态表中是否有记录。使用这个基本查询,您可以扩展where子句以满足您的需求,IE按日期过滤。