Mysql получить последнюю строку при объединении / выбрать таблицу (1: n) - PullRequest
0 голосов
/ 18 мая 2018

у меня есть таблица «user» (первичный ключ - id) и таблица «user_meta» (первичный ключ - user_id и valid_from).Таблица user содержит основные данные пользователя, например, имя пользователя, пароль и т. Д. User_meta содержит возможные изменяющиеся данные, например, фамилия, пол (да, это 2018: D) и т. Д. Поэтому у меня есть история, в какой день какие данные действительны.

Моя проблема заключается в том, что я пытаюсь выбрать всех пользователей с действующими в настоящее время данными, но у меня часто не получается ...

Как я могу выбрать правильные данные?

Для одного пользователя я могупросто используйте

"select * from user_meta 
  JOIN user on user_meta.user_id = user.id 
  ORDER BY valid_from DESC LIMIT 1" 

, но как работать с несколькими / всеми пользователями?

привет, False

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Вы, вероятно, хотите что-то в этом духе:

SELECT u.*, um.*
FROM user u
INNER JOIN user_meta um
    ON u.id = um.user_id
INNER JOIN
(
    SELECT user_id, MAX(valid_from) AS max_valid_from
    FROM user_meta
    GROUP BY user_id
) t
    ON um.user_id = t.user_id AND
       um.valid_from = t.max_valid_from;

Здесь не так много объяснений, за исключением того, что подзапрос с псевдонимом t отфильтрует все записи метаданных, кроме самой последней, для каждого пользователя.

0 голосов
/ 18 мая 2018

вы можете использовать объединение для подвыбора для группы max_valid пользователем

select * from user_meta
inner join (
    select user.id, max(user_meta.valid_from) max_valid
    from user_meta 
    JOIN user on user_meta.user_id = user.id 
    group by user.id
) t on t.id= user_meta.user_id and t.max_valid = user_meta.valid_from 

или более простым

select * from user_meta
inner join (
    select user_meta.user_id, max(user_meta.valid_from) max_valid
    from user_meta 
    group by user_meta.user_id
) t on t.user_id= user_meta.user_id and t.max_valid = user_meta.valid_from 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...