Что мне не хватает? MySQL оставил самую последнюю запись из второй таблицы - PullRequest
0 голосов
/ 08 сентября 2018

Мне нужна свежая пара глаз на это. У меня есть две таблицы, одна из которых имеет пользователей, а вторая содержит записи входа в систему, несколько записей для каждого пользователя. Я пытаюсь выбрать все записи из первой таблицы и самую последнюю запись из второй таблицы, например, список всех пользователей, но отображать только самые последние действия. Обе таблицы имеют автоинкремент в столбце ID.

Мой код в настоящее время таков:

SELECT u.user_id, u.name, u.email, r.rid, r.user_id
FROM users AS u
LEFT JOIN login_records AS r ON r.user_id = u.user_id
WHERE
   r.rid = (
      SELECT MAX( rid )
      FROM login_records
      WHERE user_id = u.user_id
   )

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

Я впервые использую JOIN - у меня неправильный JOIN? Нужно ли заказывать или группировать вещи по-другому?

Спасибо за вашу помощь. Это должно быть что-то простое, так как ответ Дэнни Куломба , появляющийся здесь , кажется, работает для других пользователей.

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Вам необходимо ORDER BY с тем, какой столбец вы хотите отобразить по desc, например ORDER BY last_login DESC .

Измените столбец last_login на столбец, который вы хотите заказать, но вы должны сначала объявить столбец last_login после SELECT .

0 голосов
/ 08 сентября 2018

Вам понадобится подзапрос, который я считаю:

https://www.db -fiddle.com / ж / 2wudMDVxReYJz4FEyG19Va / 0

CREATE TABLE users (
user_id  INT UNSIGNED NOT NULL 
  AUTO_INCREMENT PRIMARY KEY
);

CREATE TABLE users_logins (
user_login_id  INT UNSIGNED NOT NULL 
  AUTO_INCREMENT PRIMARY KEY,
  user_id  INT UNSIGNED NOT NULL 
);

INSERT INTO users SELECT 1;
INSERT INTO users SELECT 2;

INSERT INTO users_logins SELECT 1,1;
INSERT INTO users_logins SELECT 2,1;
INSERT INTO users_logins SELECT 3,1;
INSERT INTO users_logins SELECT 4,1;
INSERT INTO users_logins SELECT 5,2;
INSERT INTO users_logins SELECT 6,2;

И запрос:

SELECT 
u.user_id, ul.latest_login_id
FROM users u
    LEFT JOIN
    (
      SELECT user_id, MAX(user_login_id) latest_login_id
      FROM users_logins
      GROUP BY user_id
    ) ul ON u.user_id = ul.user_id
0 голосов
/ 08 сентября 2018

Как насчет замены всех rid в предложении where и коррелированного подзапроса на record_id?

SELECT u.user_id, u.name, u.email, r.rid, r.record_id, r.user_id
FROM test_users AS u
LEFT JOIN test_login_records AS r ON r.user_id = u.user_id
WHERE 
 (r.record_id = (
   SELECT MAX(record_id)
   FROM test_login_records
      WHERE user_id = u.user_id
  ) OR r.record_id is null);

Тест здесь

...