如果没有从一个表中选择,请检查任一表上是否存在数据

时间:2015-01-30 14:02:06

标签: php mysql sql laravel

我有两个表一个用于房间,另一个用于房间状态,其中包含房间的状态,如果忙或不,现在我有这个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表并标记为免费

2 个答案:

答案 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按日期过滤。