MYSQL - Выбор существующих пользователей, которые не сделали запись за последние 3 месяца, но сделали запись за последние 6 месяцев - PullRequest
0 голосов
/ 13 октября 2010

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

В основном ищет пользователей, которые используют нас 3-6 месяцев назад, но не используют в последние 3 месяца.

Для примера предположим, что у меня есть две таблицы с именем event (id, clientFK, inserttion_date, officeFK) и client (id, name):

SELECT DISTINCT e.id, e.insertion_date, c.name
FROM event e
LEFT JOIN client c ON c.id = e.clientFK
WHERE e.id NOT IN (   
SELECT e.id
FROM event e
WHERE e.insertion_date
BETWEEN (
NOW( ) - INTERVAL 3
MONTH
)
AND NOW( )
)
AND e.insertion_date > ( NOW( ) - INTERVAL 6
MONTH )
AND officeFK =1
ORDER BY e.insertion_date DESC

** ОБНОВЛЕНИЕ *** id - это просто автоинкрементный столбец, поэтому, очевидно, он никогда не будет отображаться с использованием приведенной выше логики.Я имел в виду поиск clientFK в таблице событий.Исходя из первого ответа, приведенного ниже, я пришел к следующему:

SELECT DISTINCT e.clientFK, e.insertion_date, c.name
FROM event e
LEFT JOIN client c ON c.id = e.clientFK
WHERE e.clientFK NOT IN (
  SELECT e.clientFK FROM event e
  WHERE e.insertion_date > (NOW() - INTERVAL 3 DAY)
)
AND e.insertion_date BETWEEN (NOW() - INTERVAL 3 DAY) AND (NOW() - INTERVAL 6 MONTH)
AND officeFK =1
ORDER BY e.insertion_date DESC

Однако, даже если сузить подзапрос NOT IN до 3 дней, я все равно возвращаю 0 строк.Изменение NOT IN на IN также приводит к возвращению 0 строк.В моей таблице событий есть тысячи строк, где clientFK "NOT IN" последние 3 дня.Я должен сделать что-то не так.

ПРАВИЛЬНЫЙ КОД НИЖЕ:

SELECT DISTINCT e.id, e.insertion_date, c.name
FROM event e
JOIN client c ON c.id = e.clientFK
WHERE e.clientFK NOT IN (
  SELECT e.clientFK FROM event e
  WHERE e.insertion_date > (NOW() - INTERVAL 3 MONTH)
)
AND e.insertion_date < (NOW() - INTERVAL 3 MONTH)
AND insertion_date > (NOW() - INTERVAL 6 MONTH)
AND e.officeFK = 1
ORDER BY e.insertion_date DESC

1 Ответ

1 голос
/ 13 октября 2010

Есть несколько способов сделать это. Но я думаю, что ты рядом. Похоже, у вас нет правильного диапазона дат в течение 3-6 месяцев в основном запросе. Вы проверяли что-нибудь от 6 месяцев до сих пор. Это не соответствует спецификации OP - пользователей события 3-6 месяцев назад, но не в течение последних 3 месяцев. По логике это выглядит так же, но попробуйте это.

SELECT DISTINCT e.id, e.insertion_date, c.name
FROM event e
JOIN client c ON c.id = e.clientFK
WHERE e.clientFK NOT IN (
  SELECT e.clientFK FROM event e
  WHERE e.insertion_date > (NOW() - INTERVAL 3 MONTH)
)
AND e.insertion_date BETWEEN (NOW() - INTERVAL 3 MONTH) AND (NOW() - INTERVAL 6 MONTH)
AND e.officeFK = 1
ORDER BY e.insertion_date DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...