我有两张桌子。汽车表和出租表。

汽车:

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/

10-16 08:11