Php 如果不从一个表中选择,则检查两个表中是否存在数据
我有两个表,一个用于房间,另一个用于房间状态,其中包含房间的状态(如果忙或不忙),现在我有了这个sql,它检查房间表中的所有房间,但只返回房间状态表中空闲房间的结果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
$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子句以满足您的需要,即按日期过滤