MariaDB SELECT запрос с date_add () - PullRequest
0 голосов
/ 25 марта 2020

У меня есть конкретный запрос на выборку, который действует странно:

(1)

select date_add(
        CURRENT_DATE(), 
        INTERVAL 7*0+(CASE 
                        WHEN tutoring_disponibilities.day < weekday(CURRENT_DATE()) 
                        THEN 7+(tutoring_disponibilities.day-weekday(CURRENT_DATE()))
                        ELSE tutoring_disponibilities.day-weekday(CURRENT_DATE())
                        END
                    ) 
        DAY
    ) from tutoring_disponibilities where date_add(
        CURRENT_DATE(), 
        INTERVAL 7*0+(CASE 
                        WHEN tutoring_disponibilities.day < weekday(CURRENT_DATE()) 
                        THEN 7+(tutoring_disponibilities.day-weekday(CURRENT_DATE()))
                        ELSE tutoring_disponibilities.day-weekday(CURRENT_DATE())
                        END
                    ) 
        DAY
    ) NOT IN (SELECT date(tutoring_sessions.startDate) from tutoring_sessions);

Это ничего не возвращает, кроме этого (который является первой частью where): (2 )

select date_add(
        CURRENT_DATE(), 
        INTERVAL 7*0+(CASE 
                        WHEN tutoring_disponibilities.day < weekday(CURRENT_DATE()) 
                        THEN 7+(tutoring_disponibilities.day-weekday(CURRENT_DATE()))
                        ELSE tutoring_disponibilities.day-weekday(CURRENT_DATE())
                        END
                    ) 
        DAY
    ) 
    from tutoring_disponibilities;

возвращает:

'2020-03-30'
'2020-03-30'
'2020-03-31'
'2020-03-31'
'2020-03-25'
'2020-03-25'

и эту часть: (3)

SELECT date(tutoring_sessions.startDate) from tutoring_sessions;

возвращает это:

'2020-01-29'
NULL
NULL
NULL
'2020-02-05'
'2020-02-05'
'2020-02-10'
'2020-02-11'
'2020-02-18'
'2020-02-17'
'2020-02-25'
'2020-02-24'
'2020-03-02'
'2020-03-09'
'2020-03-16'
'2020-03-23'
'2020-02-13'
'2020-02-13'
'2020-02-13'
'2020-02-24'
'2020-02-29'
'2020-03-14'
'2020-03-30'
'2020-03-30'
'2020-03-30'

Мы Можно видеть, что '2020-03-30' есть в результатах запроса (3), а также в результатах запроса (2), но другие результаты запроса (2) не присутствуют в результатах запроса (3). Так почему query (1) ничего не возвращает? Если вы знаете лучший способ express этого кода, я был бы рад любой помощи!

1 Ответ

1 голос
/ 25 марта 2020

Моя рекомендация не использовать NOT IN с подзапросами. Причина в том, что любое значение NULL в подзапросе не приводит к возвращению строк.

Я рекомендую NOT EXISTS. Однако ваше выражение довольно сложное, поэтому простейшее решение для вашего запроса:

NOT IN (SELECT date(tutoring_sessions.startDate)
        FROM tutoring_sessions
        WHERE tutoring_sessions.startDate IS NOT NULL
       )

С индексом tutoring_sessions(startDate) эквивалент NOT EXISTS также может быть заметно быстрее.

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