SQL - 如何使用连接在同一个表(带子查询)上执行交集?

时间:2014-11-14 17:06:33

标签: php mysql join

我有两张桌子。汽车桌和租赁桌。

汽车:

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没有交叉语句。我原则上得到了加入的工作方式,但这让我感到困惑。有什么想法吗?

1 个答案:

答案 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的所有行都表示当前正在租借的汽车。