Получить данные, даже если одна строка NULL - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть этот запрос, чтобы получить пользователей из таблицы users, а также получить последнюю time (временную метку) из таблицы logs, где запись "login_ok".Это предназначено для отображения списка пользователей и их последнего входа в систему.

SELECT u.`id`, u.`email`, u.`firstname`, u.`lastname`, u.`type`, u.`creation_date`, MAX(l.`time`) as `last_login`
FROM `users` AS u
JOIN `logs` AS l ON u.id = l.user_id
WHERE l.`action` = 'login_ok'
AND `visible` = 1
GROUP BY u.`id`
ORDER BY u.`id` ASC

Моя проблема заключается в следующем: если пользователь никогда не входил в систему, запись "login_ok" для этого не существует.пользователь, поэтому запрос не может получить эти пользовательские данные.

Есть ли способ получить все пользовательские данные, даже если l.time в logs не существует?Я пытался с JOIN name_admin_users_log AS l ON (l. time IS NOT NULL AND u.id = l.user_id), но все еще не показываю этого нового пользователя без логина.

Ответы [ 4 ]

0 голосов
/ 30 ноября 2018

Вы должны использовать соединения ВЛЕВО / ВПРАВО вместо JOIN (внутренний) Например:

SELECT u.id, u.name, l.time
FROM users u LEFT JOIN logs l
  ON u.id=l.user_id

В этом случае вы получите ВСЕ записи от «пользователей» (таблица слева ввыберите: users - left, logs - right) и все записи из правой ('logs') таблицы, для которой выполняется условие u.id = l.user_id.

Наконец вы получите что-то вроде этого:

u.id   u.name   l.time
 1      John    10.00am
 2      Mary    2.15pm
 3      Mark    null
0 голосов
/ 30 ноября 2018

Используйте left join:

SELECT u.`id`, u.`email`, u.`firstname`, u.`lastname`, u.`type`, u.`creation_date`, MAX(l.`time`) as `last_login`
FROM `users` u LEFT JOIN
     `logs` l
     ON u.id = l.user_id AND l.`action` = 'login_ok'
WHERE u.`visible` = 1
GROUP BY u.`id`
ORDER BY u.`id` ASC;

Предполагается, что visible находится в users.Если оно в logs, то это условие также должно быть в предложении ON.

0 голосов
/ 30 ноября 2018

Используйте LEFT JOIN вместо обычного JOIN (что на самом деле означает INNER JOIN) и переместите фильтр на action = 'login_ok' в это предложение LEFT JOIN.

Примечание: из вашего запросамы не можем сказать, из какой таблицы взят столбец visible, поэтому я предположил, что он связан с users ...

SELECT
    u.id, 
    u.email,
    u.firstname,
    u.lastname,
    u.type,
    u.creation_date,
    MAX(l.time) as last_login
FROM users AS u
LEFT JOIN logs AS l
    ON u.id = l.user_id and l.action = 'login_ok' 
WHERE u.visible = 1
GROUP BY u.id
ORDER BY u.id ASC
0 голосов
/ 30 ноября 2018

Вы можете просто игнорировать login_ok и искать все значения l.action.

Но если вам нужны только значения с login_ok и null, вы можете сделать:

WHERE l.`action` = 'login_ok' OR l.`action` is null 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...