我有两张桌子。汽车表和出租表。
汽车:
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为NOT NULL的Renteals相交。
伪sql将是这样的。
选择DISTINCT car.id(这样就不会返回重复的历史租金),并与reg.end为NOT NULL的汽车租赁表结合。这将给我所有未租用的汽车(租期届满)。但是,我需要将其与reg.end为null的汽车租赁列表相交,以确定该汽车实际上没有被租赁。
我知道SQL没有相交语句。我知道联接的工作原理,但这使我感到困惑。有任何想法吗?
最佳答案
您只需将车表与子选择相对应,即可确定租用和未租用的汽车,而子选择可确定当前已出租的汽车。
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
的所有行都表示当前正在租借的汽车。关于php - SQL-如何使用联接在同一表上执行交集(带有子查询)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26935252/