除了mysql中的替换?

除了mysql中的替换?,mysql,Mysql,我必须用mysql写一些代码,但我主要是用MS SQL写的,这里有个问题,在MS SQL中我可以使用,除了,一切对我来说都很好。但在MySQL中并没有这么简单,我尝试了notin和notexists,但它没有给我相同的输出。我的MS SQL代码是: SELECT P.IDRoom, R.IDRoom, R.DateB, R.DataE FROM Room P LEFT JOIN Reservation R ON P.IDRoom = R.IDRoom JOIN Hotel H ON P.IDHo

我必须用mysql写一些代码,但我主要是用MS SQL写的,这里有个问题,在MS SQL中我可以使用,除了,一切对我来说都很好。但在MySQL中并没有这么简单,我尝试了notin和notexists,但它没有给我相同的输出。我的MS SQL代码是:

SELECT P.IDRoom, R.IDRoom, R.DateB, R.DataE
FROM Room P LEFT JOIN Reservation R ON P.IDRoom = R.IDRoom
JOIN Hotel H ON P.IDHotelu = H.IDHotelu
WHERE P.NumberOfBeds = 2 AND H.IDHotelu = 2 
EXCEPT
SELECT P.IDRoom, R.IDRoom, R.DateB, R.DataE
FROM Room P JOIN Reservation R ON P.IDRoom = R.IDRoom
WHERE '2017-12-10' BETWEEN DataB AND DataE;

就像你可以看到的,我在寻找有两张床的酒店,酒店id是2。但我不想看到已经预订的房间,所以我使用Exception并查找已预订的房间。。。但是在MS SQL中很容易,在MySQL中没有任何东西适合我。有什么想法吗?

我通常创建一个子查询,并使用左连接将外部表连接到它。然后,您可以将一个WHERE列设置为NULL

SELECT
    P.IDRoom
   ,R.IDRoom
   ,R.DateB
   ,R.DataE
FROM
    Room P
    LEFT JOIN Reservation R ON P.IDRoom = R.IDRoom
    INNER JOIN Hotel H ON P.IDHotelu = H.IDHotelu
LEFT JOIN (
    SELECT
        P.IDRoom AS IDRoom1
        ,R.IDRoom AS IDRoom2
        ,R.DateB
        ,R.DataE
    FROM
        Room P
        JOIN Reservation R ON P.IDRoom = R.IDRoom
    WHERE
        '2017-12-10' BETWEEN DataB AND DataE
) AS e ON  P.IDRoom = e.IDRoom1 AND R.IDRoom = e.IDRoom2 AND R.DateB = e.DateB AND R.DataE = R.DataE
WHERE
    P.NumberOfBeds = 2 AND H.IDHotelu = 2 
    AND e.IDRoom1 IS NULL

以下查询的行为应类似于


这是正确的方向。请发布您的MySQL查询,以便我们可以查看它,因为SQL Server查询正在运行,对MySQL结果没有影响。不存在确实是正确的方向,具有明显的。。。选择不同的。。。从…起不存在。。。EXCEPT返回EXCEPT运算符左侧查询中的任何不同值,这些值不是从右侧查询返回的。来源我试过从P房间选择P.IDRoom,R.IDRoom,R.DateB,R.DateE从P房间左加入预订R在P.IDRoom=R.IDRoom加入酒店H在P.IDHotelu=H.IDHotelu其中P.NumberOfBeds=2和H.IDHotelu=2且不存在从预订中选择DateB,DateE在DateB和DateE之间的“2017-12-10”;当我尝试与不同的日期谁没有预定它的工作。。。显示所有行,但当我尝试检查是否排除已预订的行时,所有行都消失了。。。。所以我的逻辑有错误。谢谢,它在工作。我只是想知道我的逻辑错误在哪里,但我将首先分析这段代码MySQL没有EXCEPT函数。因此,您只需在子查询中保留JOIN,并请求子查询中没有匹配记录或为NULL的任何行。
SELECT P.IDRoom, R.IDRoom, R.DateB, R.DataE
FROM Room P 
LEFT JOIN Reservation R ON P.IDRoom = R.IDRoom
JOIN Hotel H ON P.IDHotelu = H.IDHotelu
WHERE P.NumberOfBeds = 2 AND H.IDHotelu = 2 
    AND NOT EXISTS (
        SELECT 1
        FROM Room i_P 
        JOIN Reservation i_R ON i_P.IDRoom = i_R.IDRoom
        WHERE '2017-12-10' BETWEEN DataB AND DataE
            AND i_P.IDRoom = P.IDRoom
    )