我有两张桌子。汽车桌和租赁桌。
汽车:
id brand
--------
0 honda
1 yota
租赁:
id id_car start end
--------
1 1 1 2
2 1 2 NULL
我需要执行两个查询。一个显示所有租用的汽车。另一个显示所有未租用的汽车。
第一个查询对我来说很容易。
SELECT car.id, car.brand, reg.start, reg.end
FROM car
LEFT JOIN car_registration AS reg ON car.id = reg.id_car
WHERE reg.end IS NULL
反向查询(用于确定租用的汽车)将涉及相反的方向。查找租赁列表,其中reg.id_car = car.idm其中reg.end IS NOT NULL。但是,如果一个条目存在于reg.end为NULL的同一个表中,那么实际上是租用了汽车。我需要将一个汽车租赁列表与reg.end IS NULL和renteals相交,其中reg.end IS NOT NULL。
Pseudo-sql会是这样的。
选择DISTINCT car.id(以便不返回重复的历史租赁),加入租车表,其中reg.end为NOT NULL。这将给我所有未租用的汽车(过期租赁)。但是,我需要将此与一个汽车租赁列表相交,其中reg.end为空,以确定汽车实际上没有租用。
我知道SQL没有交叉语句。我原则上得到了加入的工作方式,但这让我感到困惑。有什么想法吗?
答案 0 :(得分:0)
您可以在一个查询中同时获取租用和未租借的汽车,只需将汽车表加入一个子选项,即可确定当前租用的汽车。
SELECT
c.id AS id,
c.brand AS brand,
r.rented AS rented
FROM
(
SELECT
id,
brand
FROM car
) AS c
LEFT JOIN
(
SELECT DISTINCT
id_car,
1 AS rented
FROM car_registration
WHERE `end` IS NULL
) AS r
ON c.id = r.id_car
1
rented
的所有行都表示当前正在租借的汽车。