MySQL - Показать все даты, включая нулевое соединение с данными - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь отобразить все даты за месяц, а также в деталях бронирования, у меня есть только 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

при запуске он возвращает только даты из левой таблицы, например: Результат левого соединения

, но когда я изменяю

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**
(

возвращает данные из правой таблицы следующим образом: Правильный результат объединения

Что не так с моим кодом?

1 Ответ

0 голосов
/ 12 марта 2020

добро пожаловать в StackOverflow. Я думаю, что ваша проблема в том, что вы не совсем понимаете разницу между RIGHT JOIN и LEFT JOIN. Ознакомьтесь с этой статьей StackOverflow , в которой рассматриваются различия.

Если вы хотите отобразить все даты за месяц, вот ссылка на ответ I написал, что я верю, делает то, что вы хотите. В своем ответе я приведу пример запроса, который содержит производную таблицу, из которой вы можете выбрать, а затем LEFT JOIN ваши таблицы, чтобы он отображал все дни месяца независимо от того, есть ли данные в ваших таблицах для данного дня или нет.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...