SQL с JOIN, где столбец одной таблицы равен нулю, если глобальный WHERE не заполнен - PullRequest
1 голос
/ 09 марта 2019

прошло довольно много времени с тех пор, как мне пришлось писать SQL в последний раз. Я борюсь с выбором, и я надеялся, что вы можете указать, что мне не хватает.

У меня довольно простая структура таблиц с двумя таблицами:

  1. Пользователи
    • user_id
    • имя
  2. Оценки
    • user_id
    • оценка
    • estimation_date

Цель состоит в том, чтобы использовать начальную и конечную дату, чтобы показать все оценки всех пользователей. Для пользователей, у которых нет оценки для этого конкретного временного диапазона, я хочу, чтобы SQL возвращал мне нулевое значение.

В действительности задействовано еще несколько таблиц и столбцов, а также некоторые роли пользователя, но в этом примере это не обязательно.

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

SELECT a.id, a.name, b.estimate, b.estimation_date
FROM users a
LEFT OUTER JOIN estimates b on a.id = b.id
WHERE b.estimation_date BETWEEN $startdate AND $enddate OR b.estimation_date IS NULL

Пока пользователь вообще ничего не оценил, результат - то, что я хочу. Каждая строка является пользователем, один и тот же пользователь может встречаться несколько раз - по одному разу для каждой оценки в диапазоне дат - и пользователь без оценки имеет значение NULL в b.estimate и b.esvaluation_date.

Однако, как только пользователь сделал оценку, даже если она не находится в пределах диапазона, он больше не отображается в результате.

Каково было бы наилучшее решение для ввода даты начала и окончания и получения для всех пользователей, и для каждого пользователя, который не имеет оценки в этом диапазоне, значение NULL в этих столбцах?

1 Ответ

0 голосов
/ 09 марта 2019

Поместите условие диапазона дат в предложение on:

SELECT u.id, u.name, e.estimate, e.estimation_date
FROM users u LEFT OUTER JOIN
     estimates e
     ON u.id = e.id AND
        e.estimation_date >= $startdate AND
        (e.estimation_date <= $enddate OR e.estimation_date IS NULL)

Обратите внимание, что я также исправил псевдонимы таблиц, чтобы они не были бессмысленными буквами, а были сокращениями для имени таблицы.

...