Php 列出给定日期的所有可用汽车

Php 列出给定日期的所有可用汽车,php,mysql,sql,database,Php,Mysql,Sql,Database,大家好,我正在尝试显示给定日期内所有可用汽车的列表,我尝试在之间使用,但未成功。 在car表中添加另一个字段(status)并查询status是否是一个好主意。有好的方法吗?还是在返回日期和返回日期之间使用预订日期来显示更好 预订: id customer_id car_id booking_date return_date time_stamp ------ ----------- ------ ------------ ----------- ----

大家好,我正在尝试显示给定日期内所有可用汽车的列表,我尝试在
之间使用
,但未成功。
在car表中添加另一个字段(status)并查询status是否是一个好主意。有好的方法吗?还是在返回日期和返回日期之间使用预订日期来显示更好

预订:

    id  customer_id  car_id  booking_date  return_date  time_stamp      
------  -----------  ------  ------------  -----------  ----------------
     1            2       5  2015-11-04    2015-11-12   15.06.10 20:10  
     2            3       2  2015-11-02    2015-11-13   15.06.10 20:10  
     3            1      11  2015-11-05    2015-11-16   15.06.10 20:10  
     4            4       8  2015-11-10    2015-12-16   15.06.10 20:10  
     5            0       0  0000-00-00    0000-00-00   15.06.10 20:10  
   id  car_type_id  branch_id  registration_number  color    date_of_manifacturing  base_price_per_day  
------  -----------  ---------  -------------------  -------  ---------------------  --------------------
     1            1          1  BG-123-431           Bela     2010-11-15                               30
     2            2          1  BG-A32-212           Metalik  2015-11-04                               30
     3            3          2  PA-332-421           Metalik  2008-05-03                               35
     4            4          1  SM-312-542           Crna     2014-06-01                               35
     5            5          1  BG-4393-54           Crna     2012-05-03                               50
     6            6          1  NS-423-64            Bela     2010-10-08                               50
   id  car_type_id  branch_id  registration_number  color    date_of_manifacturing  base_price_per_day  
------  -----------  ---------  -------------------  -------  ---------------------  --------------------
     1            1          1  BG-123-431           Bela     2010-11-15                               30
     2            2          1  BG-A32-212           Metalik  2015-11-04                               30
     3            3          2  PA-332-421           Metalik  2008-05-03                               35
     4            4          1  SM-312-542           Crna     2014-06-01                               35
     5            5          1  BG-4393-54           Crna     2012-05-03                               50
     6            6          1  NS-423-64            Bela     2010-10-08                               50
目录类型:

    id  customer_id  car_id  booking_date  return_date  time_stamp      
------  -----------  ------  ------------  -----------  ----------------
     1            2       5  2015-11-04    2015-11-12   15.06.10 20:10  
     2            3       2  2015-11-02    2015-11-13   15.06.10 20:10  
     3            1      11  2015-11-05    2015-11-16   15.06.10 20:10  
     4            4       8  2015-11-10    2015-12-16   15.06.10 20:10  
     5            0       0  0000-00-00    0000-00-00   15.06.10 20:10  
   id  car_type_id  branch_id  registration_number  color    date_of_manifacturing  base_price_per_day  
------  -----------  ---------  -------------------  -------  ---------------------  --------------------
     1            1          1  BG-123-431           Bela     2010-11-15                               30
     2            2          1  BG-A32-212           Metalik  2015-11-04                               30
     3            3          2  PA-332-421           Metalik  2008-05-03                               35
     4            4          1  SM-312-542           Crna     2014-06-01                               35
     5            5          1  BG-4393-54           Crna     2012-05-03                               50
     6            6          1  NS-423-64            Bela     2010-10-08                               50
   id  car_type_id  branch_id  registration_number  color    date_of_manifacturing  base_price_per_day  
------  -----------  ---------  -------------------  -------  ---------------------  --------------------
     1            1          1  BG-123-431           Bela     2010-11-15                               30
     2            2          1  BG-A32-212           Metalik  2015-11-04                               30
     3            3          2  PA-332-421           Metalik  2008-05-03                               35
     4            4          1  SM-312-542           Crna     2014-06-01                               35
     5            5          1  BG-4393-54           Crna     2012-05-03                               50
     6            6          1  NS-423-64            Bela     2010-10-08                               50
汽车:

    id  customer_id  car_id  booking_date  return_date  time_stamp      
------  -----------  ------  ------------  -----------  ----------------
     1            2       5  2015-11-04    2015-11-12   15.06.10 20:10  
     2            3       2  2015-11-02    2015-11-13   15.06.10 20:10  
     3            1      11  2015-11-05    2015-11-16   15.06.10 20:10  
     4            4       8  2015-11-10    2015-12-16   15.06.10 20:10  
     5            0       0  0000-00-00    0000-00-00   15.06.10 20:10  
   id  car_type_id  branch_id  registration_number  color    date_of_manifacturing  base_price_per_day  
------  -----------  ---------  -------------------  -------  ---------------------  --------------------
     1            1          1  BG-123-431           Bela     2010-11-15                               30
     2            2          1  BG-A32-212           Metalik  2015-11-04                               30
     3            3          2  PA-332-421           Metalik  2008-05-03                               35
     4            4          1  SM-312-542           Crna     2014-06-01                               35
     5            5          1  BG-4393-54           Crna     2012-05-03                               50
     6            6          1  NS-423-64            Bela     2010-10-08                               50
   id  car_type_id  branch_id  registration_number  color    date_of_manifacturing  base_price_per_day  
------  -----------  ---------  -------------------  -------  ---------------------  --------------------
     1            1          1  BG-123-431           Bela     2010-11-15                               30
     2            2          1  BG-A32-212           Metalik  2015-11-04                               30
     3            3          2  PA-332-421           Metalik  2008-05-03                               35
     4            4          1  SM-312-542           Crna     2014-06-01                               35
     5            5          1  BG-4393-54           Crna     2012-05-03                               50
     6            6          1  NS-423-64            Bela     2010-10-08                               50
我的所有预订如下所示:

SELECT BOOKING.BOOKING_NUMBER, BOOKING.BOOKING_DATE,
BOOKING.RETURN_DATE, AGENCY.NAME, CAR.REGISTRATION_NUMBER,
CAR_TYPE.NAME
FROM BOOKING
JOIN AGENCY ON BOOKING.AGENCY_ID = AGENCY.ID
JOIN CAR ON CAR.ID = BOOKING.CAR_ID
JOIN CAR_TYPE ON CAR_TYPE.ID = CAR.CAR_TYPE_ID
但对于所有可用的车辆,我都不知道。
有什么例子吗?

使用您的
预订表,您可以知道哪辆车在一天内预订
@checkDate

SELECT *
FROM BOOKING
WHERE @checkDate BETWEEN booking_date  AND return_date  
因此,要在该日期获得可用汽车,您可以使用:

SELECT *
FROM Cars 
WHERE car_id not in (
                      SELECT car_id
                      FROM BOOKING
                      WHERE @checkDate BETWEEN booking_date  AND return_date  
                     )
或者在您的完整查询中

SELECT 
      BOOKING.BOOKING_NUMBER, BOOKING.BOOKING_DATE,
      BOOKING.RETURN_DATE, AGENCY.NAME, 
      CAR.REGISTRATION_NUMBER, CAR_TYPE.NAME
FROM BOOKING
JOIN AGENCY ON BOOKING.AGENCY_ID = AGENCY.ID
JOIN CAR ON CAR.ID = BOOKING.CAR_ID
JOIN CAR_TYPE ON CAR_TYPE.ID = CAR.CAR_TYPE_ID
WHERE
    CAR.car_id not in (
                        SELECT car_id
                        FROM BOOKING
                        WHERE @checkDate BETWEEN booking_date  AND return_date  
                      )

您可以使用左联接

SELECT 
  CAR.REGISTRATION_NUMBER,
  CAR_TYPE.NAME,
  AGENCY.NAME, 
  CASE 
    WHEN BOOKING.CAR_ID IS NULL THEN 'Not Booked' 
    ELSE 'Booked' 
  END AS Status,
  BOOKING.BOOKING_NUMBER, 
  BOOKING.BOOKING_DATE,
  BOOKING.RETURN_DATE
FROM CAR
INNER JOIN CAR_TYPE ON CAR_TYPE.ID      = CAR.CAR_TYPE_ID
LEFT JOIN BOOKING  ON CAR.ID            = BOOKING.CAR_ID
LEFT JOIN AGENCY   ON BOOKING.AGENCY_ID = AGENCY.ID;

这将为您提供所有可用的汽车,如果任何汽车没有预订,它将带有预订和代理的
NULL
值,
Status
列将显示它是否预订。

我认为对于较大的数据量
not IN
是否较慢?请不要使用
不存在
我只是给你一个最安全的解决方案。您也可以尝试
在预订日期和返回日期之间的@checkDate左侧加入预订,但因为我没有数据,所以不想猜测。这样,您将获得
未预订
NULL
,如果您有
预订日期和返回日期的索引,我认为可以正常工作。另一种解决方案是使用
EXISTS
,但只有通过使用数据进行测试,您才能知道什么是更好的