2014-11-11 6 views
1

Хорошо, рисуя здесь пробел и поиск не удался.Mysql: Все пользователи без активности за последние X дней

  • Пользователь таблицы: идентификатор, имя, адрес электронной
  • таблица Активность: идентификатор, метка времени, user_id

Многие пользователи, некоторые с большим количеством активности, некоторые давно, некоторые вообще ни. Я хочу, чтобы все идентификаторы пользователя, где не было активности за последние 30 дней (или вообще нет, вообще). Любой пользователь, где некоторая временная метка существует за последние 30 дней, должна быть опущена из результата.

Бонуса вопрос, вознагражден единорог слез: Как бы я изменить запрос UPDATE соответствующих строк пользователя, скажем, установка колонки в возрасте = 1

ответ

1

Вы можете вычислить 30 дней назад с помощью INTERVAL с оператором плюс или минус: CURDATE() - INTERVAL 30 DAY.

SELECT User.id 
FROM User 
LEFT JOIN Activity ON User.id = Activity.user_ID 
GROUP BY User.id 
HAVING MAX(Activity.timestamp) < CURDATE() - INTERVAL 30 DAY 
    OR MAX(Activity.timestamp) IS NULL 

MAX(Activity.timestamp) IS NULL должны заботиться пользователей, которые не имеют никакой активности.

+0

Большое спасибо. Черт, я сблизился с выбором u. *, A.id, a.timestamp от пользователя u left join activity a on u.id = a.user_id и max (a.timestamp)

+0

Ed, Это блестяще - но всегда есть больше (извините, что так требовательнее) - вы видели редактирование выше? –

+0

Ouch - я ужасен с сообщением UPDATE/JOIN :) Единственный совет, который я могу предложить, это попробовать: 'UPDATE User SET age = 1 WHERE id IN (' * весь запрос выше * ')'. –

Смежные вопросы