Problemas con la siguiente consulta MySQL

Tengo una tabla en MySql con los siguientes datos, donde id_pers es una foreign key a otra tabla personas.

--------------------------------------------
  id   |  id_pers  |    created_at         |
--------------------------------------------
   1   |      1    | 2016-09-12 16:59:11   |
--------------------------------------------
   2   |      1    | 2016-09-12 17:03:45   |
--------------------------------------------
  3    |      1    | 2016-09-12 17:03:30   |
--------------------------------------------
  4    |      2    | 2016-09-12 18:05:29   |
--------------------------------------------
  5    |      2    | 2016-09-12 18:03:00   |
--------------------------------------------

Como puedo sacar el ultimo registro insertado agrupado por id_pers. La select que yo estoy realizando es:

select id, id_pers, max(created_at) as fecha_creacion
from observaciones group by id_pers

Lo que me devuelve:

--------------------------------------------
  id   |  id_pers  |    created_at         |
--------------------------------------------
  1    |      1    | 2016-09-12 17:03:45   |
--------------------------------------------
  4    |      2    | 2016-09-12 18:05:29   |
--------------------------------------------

Me devuelve un id=1 en el primer registro cuando debería ser id=2. Sin embargo el id=4 me lo devuelve bien.

Las columnas son de tipo id => INT, id_pers => INT y created_at => TIMESTAMP.

Gracias de antemano.

3
задан 20.09.2016, 18:53
2 ответа

То, в чем ты нуждаешься, состоит в том, чтобы получать максимальную дату из-за id_pers и потом ты можешь делать один JOIN с первоначальной таблицей:

SELECT om.*
FROM observaciones o
INNER JOIN (SELECT id_pers, MAX(created_at) max_created
            FROM observaciones
            GROUP BY id_pers) om
    ON o.id_pers = om.id_pers
    AND o.created_at = om.max_created;
4
ответ дан 24.11.2019, 13:25

Почему код вопроса не функционирует:

  • Detection of Функтиональ Депенденсе

Я знаю, что я знаю мало о MySQL, но мне хотелось бы сотрудничать с другой альтернативой, используя субконсультации без JOIN:

SELECT *
FROM observaciones t
WHERE t.id =
(
    SELECT id
    FROM observaciones t1
    WHERE t1.id_pers = t.id_pers
    ORDER BY created_at DESC
    LIMIT 1
);

Код функционируя:

Этот код я смог делать это благодаря следующей документации:

  • ВЕРЬТЕ В TABLE Syntax
  • Comment Syntax
  • Subquery Syntax
  • Comparisons Усинг Субкерьес

Он не понимал, почему MySQL позволяет включать в SELECT поля, которые не в GROUP BY, но сомнения прояснились, прочитав:

  • GROUP BY Modifiers
  • MySQL Handling of GROUP BY
3
ответ дан 24.11.2019, 13:25

Теги

Похожие вопросы