Показать пользователей, которые еще не создали проекты в этом месяце в определенном городе (количество = 0) - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь перечислить своих клиентов, которые еще не создали проект в определенном городе.

SELECT u.userName
FROM (SELECT DISTINCT userName FROM projects) u
LEFT JOIN projects p
    ON u.userName = p.userName AND
       MONTH(p.date) = MONTH(CURRENT_DATE()) AND
       YEAR(p.date) = YEAR(CURRENT_DATE()) AND
       p.city = "Bordeaux";
WHERE
    p.userName IS NULL

В этом коде перечислены все мои клиенты без проекта, но фильтр города не работает.

Что я делаю не так?

Спасибо

РЕДАКТИРОВАТЬ: живой пример: http://sqlfiddle.com/#!9/53de526/5

Ответы [ 3 ]

3 голосов
/ 20 мая 2019

Ваш запрос LEFT JOIN вернет значение NULL userName для строк, которые не соответствуют любому условий JOIN, поэтому он вернет множество результатов, которые не соответствуют ты хочешь. Подзапрос NOT EXISTS будет работать лучше в этом сценарии:

SELECT DISTINCT userName
FROM projects p1
WHERE NOT EXISTS (SELECT *
                  FROM projects p2
                  WHERE p2.userName = p1.userName
                    AND MONTH(p.date) = MONTH(CURRENT_DATE())
                    AND YEAR(p.date) = YEAR(CURRENT_DATE())
                    AND p.city = "Bordeaux")
1 голос
/ 20 мая 2019

Я бы просто использовал агрегацию:

SELECT p.userName
FROM projects p
GROUP BY u.userName
HAVING SUM( MONTH(p.date) = MONTH(CURRENT_DATE()) AND
            YEAR(p.date) = YEAR(CURRENT_DATE()) AND
            p.city = 'Bordeaux'
          );

Если у вас есть отдельный список пользователей, я бы использовал NOT EXISTS:

select u.*
from users u
where not exists (select 1
                  from projects p
                  where p.username = u.username and
                        month(p.date) = month(CURRENT_DATE()) and
                        year(p.date) = year(CURRENT_DATE()) AND
                        p.city = 'Bordeaux'
                 );
0 голосов
/ 20 мая 2019

Вы должны включить p.city = 'Bordeaux' в ваш запрос WHERE. Не ваше предложение ON.

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