Sub SQL Query для сбора различных логинов

0

Мне нужно получить список пользователей, которые вошли в систему за последние 7 дней, и счет, который они зарегистрировали, учитывая следующие таблицы (сокращенные для простоты):

+-------------------+     +-----------------------------+
|       users       |     |         event_logs          |
+-------------------+     +-----------------------------+
|  id  |   name     |     | user  | event  | created_at |
+-------------------+     +-----------------------------+
|   1  | Jake       |     |   1   | login  |     date   |
|   2  | Jenny      |     |   2   | login  |     date   |
|   3  | Polly      |     |   2   | login  |     date   |
+-------------------+     |   2   | login  |     date   |
                          |   1   | login  |     date   |
                          |   3   | login  |     date   |
                          |   3   | login  |     date   |
                          |   1   | login  |     date   |
                          +-----------------------------+

До сих пор мне удалось присоединиться к двум таблицам и получить доступ к строкам входа, но результаты содержат дубликаты и без учета.

SELECT u.name, e.created_at
FROM event_logs e
INNER JOIN users u ON e.user = u.id
WHERE e.event = "login" 
AND DATE(e.created_at) >= DATE_ADD(CURDATE(), INTERVAL -7 DAY)
ORDER BY u.id;

Поэтому я попытался сделать подзапрос, но запустил select * FROM (<<THAT QUERY ABOVE>>) logins; возвращает синтаксическую ошибку:

  • 0
    Вы должны использовать GROUP BY . Вы можете найти множество постов здесь в SO, демонстрирующих функциональность GROUP BY .
Теги:

1 ответ

1

Во-первых, значение должно быть обернуто одиночной цитатой. Вам также не нужен подзапрос, чтобы подсчитать количество экземпляров, в которые пользователь вошел. Вы можете напрямую использовать COUNT() и GROUP BY.

SELECT u.name, 
       COUNT(e.created_at) AS TOTAL_COUNT
FROM   event_logs e
       INNER JOIN users u ON e.user = u.id
WHERE  e.event = 'login'
       AND DATE(e.created_at) >= DATE_ADD(CURDATE(), INTERVAL -7 DAY)
GROUP  BY u.name

Ещё вопросы

Сообщество Overcoder
Наверх
Меню