PHP - como hacer esta sentencia en MySQL

 
Vista:
Imágen de perfil de Rosman
Val: 26
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

como hacer esta sentencia en MySQL

Publicado por Rosman (13 intervenciones) el 03/06/2017 04:47:22
Buenas noches, debo hacer una consulta SQL pero no consigo la manera de realizarla correctamente; tengo en una tabla distintos tipos de consultas, diferenciados todos por una caracteristicas; quisiera buscar la manera de organizarlas mostrando solo las que tengan el ID mas alto de cada una de ellas, creo que la mejor manera de explicarlo es con imagenes
WhatsApp-Image-2017-06-01-at-4.22.20-PM

del lado izquierdo esta la tabla normal, y de lado derecho como deseo que me quede; solo los id mas altos de cada una de las caracteristicas (mas alto del "A", de "B", de "C" y de "D") , alguien podria decirme que usar??
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
Imágen de perfil de kip
Val: 2.325
Plata
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

como hacer esta sentencia en MySQL

Publicado por kip (877 intervenciones) el 03/06/2017 10:30:52
Hola, lo que podrías hacer es agrupar por Tipo y usar la función MAX() para obtener el ID mas alto de cada agrupación, así:

1
SELECT MAX(ID) AS ID, TIPO, TITULO, MENSAJE FROM tabla GROUP BY TIPO

Aunque según entiendo el GROUP BY nativamente te mostrará él ultimo registro de la agrupación, así que puedes probar sin la función MAX también:

code]SELECT ID, TIPO, TITULO, MENSAJE FROM tabla GROUP BY TIPO[/code]

Te funciona ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 729
Bronce
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

como hacer esta sentencia en MySQL

Publicado por gonzalo (615 intervenciones) el 03/06/2017 17:43:17
max te daria solamente el id mas grande.

yo usaria

SELECT * FROM tabla order by id Desc

eso ordenaria la lista del id mas grande al menor.

con top 5 mostraria solamente los primeros 5 conforme al orden de la lista.

salu2
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
Imágen de perfil de kip
Val: 2.325
Plata
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

como hacer esta sentencia en MySQL

Publicado por kip (877 intervenciones) el 03/06/2017 19:40:56
Hola Gonzalo, MAX() junto con GROUP BY te retornaria lo que exactamente esta buscando el usuario, es decir los IDs mas altos de cada TIPO, probemos primero lo que comentas:

Esta es la tabla:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> SELECT * FROM test;
+----+------+-----------+------------+
| ID | TIPO | TITULO    | MENSAJE    |
+----+------+-----------+------------+
|  1 | A    | TITULO 1  | MENSAJE 1  |
|  2 | C    | TITULO 2  | MENSAJE 2  |
|  3 | B    | TITULO 3  | MENSAJE 3  |
|  4 | A    | TITULO 4  | MENSAJE 4  |
|  5 | D    | TITULO 5  | MENSAJE 5  |
|  6 | C    | TITULO 6  | MENSAJE 6  |
|  7 | A    | TITULO 7  | MENSAJE 7  |
|  8 | B    | TITULO 8  | MENSAJE 8  |
|  9 | D    | TITULO 9  | MENSAJE 9  |
| 10 | A    | TITULO 10 | MENSAJE 10 |
| 11 | B    | TITULO 11 | MENSAJE 11 |
| 12 | C    | TITULO 12 | MENSAJE 12 |
| 13 | D    | TITULO 13 | MENSAJE 13 |
| 14 | A    | TITULO 14 | MENSAJE 14 |
+----+------+-----------+------------+
14 rows in set

Entonces hagamos un SELECT * FROM tabla order by id Desc con un LIMIT 5 (en MySQL no existe la sentencia TOP) que es lo que comentabas:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM test ORDER BY ID DESC LIMIT 5;
+----+------+-----------+------------+
| ID | TIPO | TITULO    | MENSAJE    |
+----+------+-----------+------------+
| 14 | A    | TITULO 14 | MENSAJE 14 |
| 13 | D    | TITULO 13 | MENSAJE 13 |
| 12 | C    | TITULO 12 | MENSAJE 12 |
| 11 | B    | TITULO 11 | MENSAJE 11 |
| 10 | A    | TITULO 10 | MENSAJE 10 |
+----+------+-----------+------------+
5 rows in set

Eso es lo que retorna y no es lo mismo que coloco en la imagen Rosman.

Tu recomendacion funcionaria si en lugar del LIMIT 5 lo cambiamos a 4:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM test ORDER BY ID DESC LIMIT 4;
+----+------+-----------+------------+
| ID | TIPO | TITULO    | MENSAJE    |
+----+------+-----------+------------+
| 14 | A    | TITULO 14 | MENSAJE 14 |
| 13 | D    | TITULO 13 | MENSAJE 13 |
| 12 | C    | TITULO 12 | MENSAJE 12 |
| 11 | B    | TITULO 11 | MENSAJE 11 |
+----+------+-----------+------------+
4 rows in set

El problema de aquella consulta es que se tendria que estar cambiando siempre el LIMIT si se agregan nuevos valores al campo TIPO diferentes de A, B, C, D, ademas de que si se tiene un TIPO por ejemplo 'A' agregado continuamente es decir algo asi:

1
2
3
4
5
6
7
| 12 | C    | TITULO 12 | MENSAJE 12 |
| 13 | D    | TITULO 13 | MENSAJE 13 |
| 14 | A    | TITULO 14 | MENSAJE 14 |
| 15 | A    | TITULO 15 | MENSAJE 15 |
| 16 | A    | TITULO 16 | MENSAJE 16 |
| 17 | A    | TITULO 17 | MENSAJE 17 |
+----+------+-----------+------------+

Tu query no funcionaria mas:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM test ORDER BY ID DESC LIMIT 4;
+----+------+-----------+------------+
| ID | TIPO | TITULO    | MENSAJE    |
+----+------+-----------+------------+
| 17 | A    | TITULO 17 | MENSAJE 17 |
| 16 | A    | TITULO 16 | MENSAJE 16 |
| 15 | A    | TITULO 15 | MENSAJE 15 |
| 14 | A    | TITULO 14 | MENSAJE 14 |
+----+------+-----------+------------+
4 rows in set

Ahora probemos simplemente con un GROUP BY:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM test GROUP BY TIPO;
+----+------+----------+-----------+
| ID | TIPO | TITULO   | MENSAJE   |
+----+------+----------+-----------+
|  1 | A    | TITULO 1 | MENSAJE 1 |
|  3 | B    | TITULO 3 | MENSAJE 3 |
|  2 | C    | TITULO 2 | MENSAJE 2 |
|  5 | D    | TITULO 5 | MENSAJE 5 |
+----+------+----------+-----------+
4 rows in set

Me agrupa por TIPO pero solo me esta mostrando los ID mas bajos, ahora usemos MAX():

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT MAX(ID) AS ID, TIPO, TITULO, MENSAJE FROM test GROUP BY TIPO;
 
+----+------+----------+-----------+
| ID | TIPO | TITULO   | MENSAJE   |
+----+------+----------+-----------+
| 14 | A    | TITULO 1 | MENSAJE 1 |
| 11 | B    | TITULO 3 | MENSAJE 3 |
| 12 | C    | TITULO 2 | MENSAJE 2 |
| 13 | D    | TITULO 5 | MENSAJE 5 |
+----+------+----------+-----------+
4 rows in set

Como vemos tenemos los IDs mas altos de cada tipo de mensaje, en la imagen que coloco Rosman el ultimo que es el D es el 9 pero en realidad no es el mas alto, el mas alto es el 13 si nos fijamos en la tabla.

Pero de todas formas hay un problema, si nos fijamos los valores de MENSAJE y TITULO no corresponden a los IDs que estan alli, y es porque al usar MAX() se pierde la correlacion, esto se soluciona con un WHERE IN y una SUBQUERY, asi:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM test WHERE ID IN (SELECT MAX(ID) AS ID FROM test GROUP BY TIPO);
 
+----+------+-----------+------------+
| ID | TIPO | TITULO    | MENSAJE    |
+----+------+-----------+------------+
| 11 | B    | TITULO 11 | MENSAJE 11 |
| 12 | C    | TITULO 12 | MENSAJE 12 |
| 13 | D    | TITULO 13 | MENSAJE 13 |
| 14 | A    | TITULO 14 | MENSAJE 14 |
+----+------+-----------+------------+
4 rows in set

Y por ultimo podriamos agregar un ORDER BY TIPO:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM test WHERE ID IN (SELECT MAX(ID) AS ID FROM test GROUP BY TIPO) ORDER BY TIPO;
 
+----+------+-----------+------------+
| ID | TIPO | TITULO    | MENSAJE    |
+----+------+-----------+------------+
| 14 | A    | TITULO 14 | MENSAJE 14 |
| 11 | B    | TITULO 11 | MENSAJE 11 |
| 12 | C    | TITULO 12 | MENSAJE 12 |
| 13 | D    | TITULO 13 | MENSAJE 13 |
+----+------+-----------+------------+
4 rows in set

ddc0c34978ad4098a2e14763aba3f834
del lado izquierdo esta la tabla normal, y de lado derecho como deseo que me quede; solo los id mas altos de cada una de las caracteristicas (mas alto del "A", de "B", de "C" y de "D") , alguien podria decirme que usar??

Ahora si retorna lo esperado, a excepción de ID 9 que en realidad en la imagen esta mal, ya que el ID mayor del TIPO 'C' es 13.

Probemos tambien con un ingreso continuo de un TIPO, por ejemplo 'A':

1
2
3
4
5
6
7
| 12 | C    | TITULO 12 | MENSAJE 12 |
| 13 | D    | TITULO 13 | MENSAJE 13 |
| 14 | A    | TITULO 14 | MENSAJE 14 |
| 15 | A    | TITULO 15 | MENSAJE 15 |
| 16 | A    | TITULO 16 | MENSAJE 16 |
| 17 | A    | TITULO 17 | MENSAJE 17 |
+----+------+-----------+------------+

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM test WHERE ID IN (SELECT MAX(ID) AS ID FROM test GROUP BY TIPO) ORDER BY TIPO;
 
+----+------+-----------+------------+
| ID | TIPO | TITULO    | MENSAJE    |
+----+------+-----------+------------+
| 17 | A    | TITULO 17 | MENSAJE 17 |
| 11 | B    | TITULO 11 | MENSAJE 11 |
| 12 | C    | TITULO 12 | MENSAJE 12 |
| 13 | D    | TITULO 13 | MENSAJE 13 |
+----+------+-----------+------------+
4 rows in set

No existiria problema alguno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Rosman
Val: 26
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

como hacer esta sentencia en MySQL

Publicado por Rosman (13 intervenciones) el 04/06/2017 00:17:50
Mil gracias probe varias y todas funcionaron, de verdad es bueno conar con la ayuda de tantas personas y que responden tan pronto, espero poder ayudar en algun momento a cualquiera que necesite mi ayuda cuando mejore en mi codigo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar