MySQL - GROUP BY DE LOS ÚLTIMOS REGISTROS EN MYSQL

 
Vista:

GROUP BY DE LOS ÚLTIMOS REGISTROS EN MYSQL

Publicado por victor Godoy (1 intervención) el 28/04/2018 22:59:56
Buenas tardes comunidad, necesito su colaboración para una consulta tengo una bases de datos donde relaciono dos tablas, y quiero realizar un group by para los campos que se repiten, pero el problema es que el group by siempre trae el primer registro, lo que quiero es mostrar el ultimo registro. de antemano gracias por su colaboración.

https://imgur.com/S9p8tHb

Y MI CONSULTA LA TENGO DE ESTA FORMA

1
2
3
4
5
$marketings	= $this->db->select('*');
$marketings	= $this->db->from('marketing p');
$marketings	= $this->db->join('estado m', 'p.id_cliente = m.id_cliente','INNER');
$marketings	= $this->db->group_by('m.id_cliente');
$marketings	= $this->db->order_by('m.id_estado', 'DESC');
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

GROUP BY DE LOS ÚLTIMOS REGISTROS EN MYSQL

Publicado por leonardo_josue (414 intervenciones) el 30/04/2018 16:53:32
Hola Victor:

No nos dices cómo determinas cuál es el último registro de un cliente en la tabla de estados y por lo tanto resulta algo complicado darte una respuesta puntual. También estás mezclando conceptos de MySQL con los de algún lenguaje de programacíon (puedo suponer que estás programando en PHP, pero eso sólo Dios y tú lo caben). Te recuerdo que este foro es exclusivo de MySQL, por lo tanto, no es correcto que posteés código de cualquier otro lenguaje de programación. Ojo con eso para la próxima.

Para el ejemplo voy a suponer que tu campo id_estado es un consecutivo y que entonces el último registro sería el máximo id_estado que tenga cada cliente. Si no estoy en lo correcto entonces la consulta no te va servir de mucho. Bajo este supuesto entonces tienes esta tabla:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM estado;
+-----------+----------+------------+
| id_estado | estado   | id_cliente |
+-----------+----------+------------+
|         1 | estado 1 |          1 |
|         2 | estado 2 |          1 |
|         3 | estado 3 |          2 |
|         4 | estado 4 |          2 |
+-----------+----------+------------+
4 rows in set (0.01 sec)

Entonces, el primer paso es obtener el MAX id_estado para cada cliente, esto lo haces con una consulta simple:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT id_cliente, MAX(id_estado) max_id_estado
    -> FROM estado
    -> GROUP BY id_cliente;
+------------+---------------+
| id_cliente | max_id_estado |
+------------+---------------+
|          1 |             2 |
|          2 |             4 |
+------------+---------------+
2 rows in set (0.00 sec)

Una vez que tienes esto, puedes usarlo como una subconsulta para filtrar la información que te interesa, con un JOIN, así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT T1.*
    -> FROM estado T1
    -> INNER JOIN
    -> ( SELECT id_cliente, MAX(id_estado) max_id_estado
    ->   FROM estado
    ->   GROUP BY id_cliente ) T2
    -> ON  T1.id_cliente = T2.id_cliente
    -> AND T1.id_estado = T2.max_id_estado;
+-----------+----------+------------+
| id_estado | estado   | id_cliente |
+-----------+----------+------------+
|         2 | estado 2 |          1 |
|         4 | estado 4 |          2 |
+-----------+----------+------------+
2 rows in set (0.00 sec)

Sólo faltaría agregar un INNER JOIN adicional para obtener el nombre de tus clientes.

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar