我有两张桌子。车桌和租车桌。
汽车:
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不为空。但是,如果在同一个表中存在reg.end为NULL的条目,那么汽车实际上是租来的。我需要将reg.end为NULL的租车列表和reg.end不为NULL的租车列表相交。
伪sql应该是这样的。
选择DISTINCT car.id (不返回重复的历史租赁),连接租车表,其中reg.end不为NULL。这将为我提供所有未租赁的汽车(过期租赁)。但是,我需要将其与reg.end为空的汽车租赁列表相交,以确定汽车实际上并未出租。
我知道SQL没有intersect语句。我知道joins在原理上是如何工作的,但这让我感到非常困惑。有什么想法吗?
发布于 2014-11-15 02:49:50
您可以在单个查询中同时获得租赁和未租赁的汽车,只需将car表与您确定当前已出租的汽车的子选择连接起来即可。
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具有rented的1的所有行都表示当前正在出租的汽车。
https://stackoverflow.com/questions/26935252
复制相似问题