Php 如果不从一个表中选择,则检查两个表中是否存在数据

Php 如果不从一个表中选择,则检查两个表中是否存在数据,php,mysql,sql,laravel,Php,Mysql,Sql,Laravel,我有两个表,一个用于房间,另一个用于房间状态,其中包含房间的状态(如果忙或不忙),现在我有了这个sql,它检查房间表中的所有房间,但只返回房间状态表中空闲房间的结果 $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

我有两个表,一个用于房间,另一个用于房间状态,其中包含房间的状态(如果忙或不忙),现在我有了这个sql,它检查房间表中的所有房间,但只返回房间状态表中空闲房间的结果

 $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表中且标记为free,则我希望它检查rooms表中的所有房间。您可以像这样使用left join:

$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"
        )
    );

如果有必要,您可以在此基础上添加开始和结束日期。

您可以像这样使用左连接:

$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"
        )
    );

如果有必要,您可以在此基础上添加开始和结束日期。

您可以像这样使用左连接:

$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"
        )
    );

如果有必要,您可以在此基础上添加开始和结束日期。

您可以像这样使用左连接:

$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"
        )
    );

如果有必要,您可以在此基础上添加开始日期和结束日期。

一种更简单的方法是在表上执行联接

类似于

$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的房间。这里的关键是使用左联接,这样无论状态表中是否有记录,您都可以包含rooms表中的所有记录。使用这一基本查询,您可以扩展where子句以满足您的需要,即按日期过滤。

完成您尝试执行的操作的一个更简单的方法是在表上执行联接

类似于

$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的房间。这里的关键是使用左联接,这样无论状态表中是否有记录,您都可以包含rooms表中的所有记录。使用这一基本查询,您可以扩展where子句以满足您的需要,即按日期过滤。

完成您尝试执行的操作的一个更简单的方法是在表上执行联接

类似于

$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的房间。这里的关键是使用左联接,这样无论状态表中是否有记录,您都可以包含rooms表中的所有记录。使用这一基本查询,您可以扩展where子句以满足您的需要,即按日期过滤。

完成您尝试执行的操作的一个更简单的方法是在表上执行联接

类似于

$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的房间。这里的关键是使用左联接,这样无论状态表中是否有记录,您都可以包含rooms表中的所有记录。使用这个基本查询,您可以扩展where子句以满足您的需要,即按日期过滤