MySQL-显示所有日期,包括零数据嵌套联接

时间:2020-03-12 20:03:10

标签: mysql

我试图显示一个月中的所有日期,并且在预订详细信息中,我只有check_in_date和check_out_date,所以我必须在左联接中创建左联接,这是我的脚本

SELECT
    *                   
FROM
(
    SELECT 
        @dt:= DATE_ADD( @dt, interval 1 day ) myDate
    FROM
    (
        SELECT 
                @dt := '2020-01-31'
    ) vars, tb_dummy
            LIMIT 29
) JustDates 
LEFT JOIN
(
    SELECT 
        DATE_FORMAT(d.myDate2,'%Y-%m-%d') AS `myDate2`,
        COALESCE(count(rdt.reservation_detail_id), 0) AS `RNS`,
        FORMAT(SUM(rdt.subtotal_amount/COALESCE(DATEDIFF(DATE(DATE(rdt.check_out_date)), DATE(rdt.check_in_date)), 0)), 2) AS `REVENUE`,
        FORMAT(SUM(rdt.subtotal_amount/COALESCE(DATEDIFF(DATE(DATE(rdt.check_out_date)), DATE(rdt.check_in_date)), 0))/COALESCE(count(rdt.reservation_detail_id), 0), 2) AS `AVGREV`        
    FROM
    (
        SELECT 
            @dt:= DATE_ADD( @dt, interval 1 day ) myDate2
        FROM
        (
            SELECT 
                    @dt := '2020-01-31'
        ) vars2, tb_dummy
            LIMIT 29
    ) d
    LEFT JOIN 
        tb_reservation_detail rdt 
    ON d.myDate2 BETWEEN DATE(rdt.check_in_date) AND DATE(DATE(rdt.check_out_date) - INTERVAL 1 DAY)
    INNER JOIN 
        tb_reservation R 
    ON rdt.reservation_id = R.reservation_id
    WHERE 
        rdt.reservation_status_id <> 3
    AND
        R.property_id = 57
    GROUP BY d.myDate2
    ORDER BY d.myDate2 ASC
)   Resv
    ON
        JustDates.myDate = Resv.myDate2
ORDER BY
    JustDates.myDate ASC

当我运行它时,它仅返回左侧表格中的日期,例如:Left join result

但是当我改变

SELECT
    *                   
FROM
(
    SELECT 
        @dt:= DATE_ADD( @dt, interval 1 day ) myDate
    FROM
    (
        SELECT 
                @dt := '2020-01-31'
    ) vars, tb_dummy
            LIMIT 29
) JustDates 
**LEFT JOIN**
(

SELECT
    *                   
FROM
(
    SELECT 
        @dt:= DATE_ADD( @dt, interval 1 day ) myDate
    FROM
    (
        SELECT 
                @dt := '2020-01-31'
    ) vars, tb_dummy
            LIMIT 29
) JustDates 
**RIGHT JOIN**
(

它从右表中返回数据,如下所示:Right join result

我的代码有什么问题?

1 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow。我认为您的问题是您不太了解RIGHT JOINLEFT JOIN之间的区别。查看this StackOverflow post可以解决的差异。

就想显示一个月中的所有日期而言,这是我发布的link to an answer,我相信它可以满足您的要求。在我的回答中,我提供了一个示例查询,其中包含一个派生表,您可以从中选择一个表,然后LEFT JOIN到其中进行选择,这样它将显示当月的所有天数,无论表中是否有给定日期或不。

希望这会有所帮助。