2016-11-24 7 views
1

У меня есть 2 таблицы (пользователь и информация). мне нужно выбрать все пользовательские данные и связанные с ним последней вставленной 'текст подсказки' (insert_time)MySql Left Join with subselect

пользовательской таблицей

+----+--------+----------+ 
| id | name | adress | 
+----+--------+----------+ 
| 1 | Name 1 | Adress 1 | 
| 2 | Name 2 | Adress 2 | 
| 3 | user 3 | adress 3 | 
| 4 | user 4 | adress 4 | 
+----+--------+----------+ 

стола информации о

+----+---------+----------+---------------------+ 
| id | id_user | infotext | insert_time   | 
+----+---------+----------+---------------------+ 
| 1 |  1 | info 1 | 2016-11-24 14:03:23 | 
| 2 |  1 | info 2. | 2016-11-24 14:08:30 | 
| 3 |  3 | text 3. | 2016-11-24 14:08:46 | 
+----+---------+----------+---------------------+ 

Моего текущий запрос:

SELECT a.*, b.infotext FROM user a LEFT JOIN infos b 
      ON a.id = b.id_user 
     LEFT JOIN 
     (
      SELECT  id_user, MAX(insert_time) newestInsert 
      FROM  infos 
      GROUP BY id_user 
     ) c ON c.id_user = b.id_user AND 
       c.newestInsert = b.insert_time 

Но проблема в том, что он выводит идентификатор нечетким:

+----+--------+----------+----------+ 
| id | name | adress | infotext | 
+----+--------+----------+----------+ 
| 1 | Name 1 | Adress 1 | info 1 | 
| 1 | Name 1 | Adress 1 | info 2. | 
| 3 | user 3 | adress 3 | text 3. | 
| 2 | Name 2 | Adress 2 | NULL  | 
| 4 | user 4 | adress 4 | NULL  | 
+----+--------+----------+----------+ 

Окончательный результат мне нужно:

+----+--------+----------+----------+ 
| id | name | adress | infotext | 
+----+--------+----------+----------+ 
| 1 | Name 1 | Adress 1 | info 2. | 
| 3 | user 3 | adress 3 | text 3. | 
| 2 | Name 2 | Adress 2 | NULL  | 
| 4 | user 4 | adress 4 | NULL  | 
+----+--------+----------+----------+ 
+0

Добавить GROUP BY, сделать максимум на тексте подсказки. – jarlh

ответ

1

Поместите второе условие в предложении on. Этот метод делает это как коррелированные подзапросы:

SELECT u.*, i.infotext 
FROM user u LEFT JOIN 
    infos i 
    ON u.id = i.id_user and 
     i.insert_time = (SELECT MAX(i2.insert_time) 
         FROM infos i2 
         WHERE i2.id_user = i.id_user 
         ); 
0

Если производительность является ключевой ...

SELECT u.id 
    , u.name 
    , u.adress 
    , i.infotext 
    FROM user u 
    LEFT 
    JOIN 
    (SELECT x.* 
     FROM infos x 
     JOIN 
      (SELECT id_user 
        , MAX(insert_time) insert_time 
       FROM infos 
       GROUP 
        BY id_user 
      ) y 
      ON y.id_user = x.id_user 
      AND y.insert_time = x.insert_time 
    ) i 
    ON i.id_user = u.id 
ORDER 
    BY infotext IS NULL, infotext;