2014-10-01 3 views
0

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

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

SELECT 
    COUNT(user_log.type) AS logins, 
    users.name, 
    users.email, 
    users.user_id 
FROM 
    users 
LEFT JOIN 
    user_log 
ON 
    users.user_id = user_log.user_id 
WHERE 
    user_log.type = 8 
AND 
    user_log.date >= :from 
AND 
    user_log.date <= :to 
GROUP BY 
    users.user_id 

user_log.type = 8 означает, что запись журнала является Войти

: от отметки времени с датой начала

: к отметке времени с датой окончания

I используйте PDO

ответ

0

Прежде всего, вы злоупотребляя пагубное расширение MySQL для GROUP BY. У вас будет сложная отладка. Так что вам нужно GROUP BY users.name, users.email. users.id.

Путь ваш запрос написан, с элементами из вашего LEFT JOIN эд таблицы в пункте WHERE, преобразует LEFT JOIN в INNER JOIN. Таким образом, вы теряете непревзойденные строки из своей первой таблицы.

Переместить эти WHERE предметов в пункт ON, и все будет работать так, как вы хотите. Вот так.

SELECT 
    COUNT(user_log.type) AS logins, 
    users.name, 
    users.email, 
    users.user_id 
FROM users 
LEFT JOIN user_log 
ON (
    users.user_id = user_log.user_id 
AND 
    user_log.type = 8 
AND 
    user_log.date >= :from 
AND 
    user_log.date <= :to 
) 
GROUP BY 
    users.name, users.email. users.id 
0

Если вы используете ограничение на вторую таблицу с LEFT JOIN, вы получите такой же результат, как если бы вы использовали INNER JOIN, потому что вы не допустили значение NULL.

Здесь решение, вы можете попробовать, используя подзапрос:

SELECT users.name, 
    users.email, 
    users.user_id, 
    IF (logins IS NOT NULL, logins, 0) AS logins 
FROM users 
LEFT JOIN (
    SELECT user_id, COUNT(type) AS logins 
    FROM user_log 
    WHERE 
     type = 8 
    AND 
     date >= :from 
    AND 
     date <= :to 
    GROUP BY 
     user_id 
    ) AS l ON l.user_id = users.user_id 
Смежные вопросы