2017-02-04 6 views
0

У меня есть таблица, в которой хранятся все подключения пользователей (дата & ip), и я хочу получить с одним запросом все данные пользователей (псевдоним, аватар ...) + последняя запись моя история подключений таблица этого пользователя ...Выберите последнюю запись mysql слева join

SELECT 
    * 
FROM 
    `users` 
     LEFT JOIN 
    `connections_history` ON `users`.`id` = `connections_history`.`guid` 

Как я могу продолжить THX

+0

Does 'connections_history' иметь AUTO_INCREMENT PK? –

ответ

0

к сожалению Mysql не поддерживает window функции, вам нужно Correlated sub-query, чтобы сделать это.

Try что-то вроде этого

SELECT * 
FROM users 
     LEFT JOIN connections_history ch 
       ON users.id = ch.guid 
       AND EXISTS (SELECT 1 
          FROM connections_history ch1 
          WHERE ch.guid = ch1.guid 
          HAVING Max(ch1.date) = ch.date) 
0

Вы можете сделать это с помощью связанного подзапроса в предложении ON:

SELECT u.*, ch.* 
FROM `users` u LEFT JOIN 
    `connections_history` ch 
     ON ch.`guid` = u.`id` AND 
     ch.date = (SELECT MAX(ch2.date) 
        FROM connections_history ch2 
        WHERE ch.guid = ch2.guid 
        ); 

Эта формула позволяет запрос воспользоваться индексом на connections_history(guid, date).

+0

@EvaldasBuinauskas. , , Глава 1 анализа данных с использованием SQL и Excel * объясняет обоснование форматирования запроса. Не изменяйте форматирование моих запросов. –

0

Один из способов - найти строки с максимальной датой для каждого указателя в подзапросе и затем присоединиться к таблице пользователей.

Как это:

select * 
from `users` u 
left join (
    select * 
    from `connections_history` c 
    where date = (
     select max(date) 
     from `connections_history` c2 
     where c.`guid` = c2.`guid` 
    ) 
) t on u.`id` = t.`guid`; 
+1

Неплохое решение, но это означает, что индекс не может использоваться для 'LEFT JOIN'. –

0

connections_history Предполагая, что таблица имеет столбец AUTO_INCREMENT id:

SELECT * 
FROM (
    SELECT u.*, MAX(h.id) as hid 
    FROM users u 
    LEFT JOIN connections_history h ON u.id = h.guid 
    GROUP BY u.id 
) u 
LEFT JOIN connections_history h ON h.id = u.hid 
Смежные вопросы