Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

maximos de un SELECT

Estas en el tema de maximos de un SELECT en el foro de Mysql en Foros del Web. A partir de dos tablas ( usuarios y usuarios_modulos ) genero mi consulta donde consigo todos los menúes de un determinado usuario: Código PHP: "SELECT usuarios_modulos.id,id_modulo,modulo,menu ... FROM usuarios_modulos  ...
  #1 (permalink)  
Antiguo 22/12/2009, 21:41
Avatar de CdG
CdG
 
Fecha de Ingreso: marzo-2008
Mensajes: 114
Antigüedad: 16 años, 2 meses
Puntos: 2
maximos de un SELECT

A partir de dos tablas (usuarios y usuarios_modulos) genero mi consulta donde consigo todos los menúes de un determinado usuario:

Código PHP:
"SELECT usuarios_modulos.id,id_modulo,modulo,menu ... FROM usuarios_modulos 
LEFT JOIN modulos ON usuarios_modulos.id_modulo = modulos.id 
WHERE usuarios_modulos.id_usuario = $id ORDER BY modulo,menu" 
para evitar updates sobre la tabla usuarios_modulos estoy intentando obtener aquellos resultados con id máximo

gráficamente:

--------------------------------------------------------------------------------------->
id | id_modulo | id_usuario | menu ....
---------------------------------------------------------------------------->
1 | 3 | 6 | clientes <-en mi consulta consigo estos
2 | 7 | 6 | caja <-en mi consulta consigo estos
. . . .
. . . .
. . . .
94 | 3 | 6 | clientes <-estos son los que necesito
97 | 7 | 6 | caja <-estos son los que necesito

con GROUP BY id_modulo los tendría identificados pero no consigo obtener los máximos.
gracias por su tiempo
__________________
no quiero ser un árbol y caminar
Jacinto Piedra
  #2 (permalink)  
Antiguo 22/12/2009, 21:59
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 20 años, 9 meses
Puntos: 105
Respuesta: maximos de un SELECT

Holas,

Al final de tu SQL puedes usar el HAVING MAX(id_modulo)

Saludos
Gildus
__________________
.: Gildus :.
  #3 (permalink)  
Antiguo 22/12/2009, 22:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: maximos de un SELECT

SI no usas la función MAX() para ubicar el valor máximo de usuarios_modulos.id, nunca obtendrás ese máximo...
Código MySQL:
Ver original
  1. SELECT MAX(usuarios_modulos.id) id, id_modulo,modulo, menu
  2. FROM usuarios_modulos  LEFT JOIN modulos ON usuarios_modulos.id_modulo = modulos.id
  3. WHERE usuarios_modulos.id_usuario = $id
  4. GROUP BY modulo, menu
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 23/12/2009, 02:14
Avatar de CdG
CdG
 
Fecha de Ingreso: marzo-2008
Mensajes: 114
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: maximos de un SELECT

Hola gildus,
eso mismo, estuve viendo sobre el uso de HAVING y reescribí la consulta:

Código MySQL:
Ver original
  1. SELECT usuarios_modulos.id,modulos.id,modulo,menu...
  2. FROM modulos
  3. LEFT JOIN usuarios_modulos
  4. ON modulos.id = usuarios_modulos.id_modulo
  5. WHERE usuarios_modulos.id_usuario = id
  6. GROUP BY id_modulo HAVING MAX(usuarios_modulos.id)

aunque me sigue devolviendo los mismos valores... o sea, los id's que están por debajo.

Hola gnzsoloyo,
sí la escribo con:

Código MySQL:
Ver original
  1. MAX(usuarios_modulos.id)
me devuelve exactamente los id's que necesito pero los demás campos de usuarios_modulos no se corresponden con esos id's. Parece ser que por un lado me devuelve los id's mas altos pero no así los otros campos...

bueno, para no marearlos lo pregunto más fácil:
¿hay alguna manera de escribir esto sin anidar select?
Código MySQL:
Ver original
  1. SELECT * FROM usuarios_modulos WHERE id IN
  2. (SELECT MAX(id) FROM usuarios_modulos WHERE id_usuario = id group by id_modulo)

gracias!
__________________
no quiero ser un árbol y caminar
Jacinto Piedra
  #5 (permalink)  
Antiguo 23/12/2009, 03:05
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: maximos de un SELECT

Creo que tienes que ordenar descendente antes del group by. Su haces un order by having (max...), etc. estás ordenando por el máximo que sale del group by, y ese es siempre el primero. He puesto los nombres de los campos un poco al azar, pero la idea es que primero ordenas los datos descendente y luego seleccionas de todos ellos los que quieres y los agrupas: eso cargará el primero que es el id mayor.
SELECT t1.usuid, t1.modid, t1.modul, t1.menu, t1.idmodul FROM (SELECT usuarios_modulos.id usuid,modulos.id modid,modulo modul,menu menu, usuarios_modulos.id_modulo idmodul
FROM modulos
LEFT JOIN usuarios_modulos
ON modulos.id = usuarios_modulos.id_modulo
WHERE usuarios_modulos.id_usuario = id ORDER BY usuarios_modulos_id DESC)t1
GROUP BY t1.id_modul
  #6 (permalink)  
Antiguo 23/12/2009, 07:05
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 20 años, 9 meses
Puntos: 105
Respuesta: maximos de un SELECT

Holas, y asi?:

SELECT usuarios_modulos.id,modulos.id,modulo,menu...
FROM modulos
LEFT JOIN usuarios_modulos
ON modulos.id = usuarios_modulos.id_modulo
WHERE usuarios_modulos.id_usuario = id
GROUP BY id_modulo HAVING usuarios_modulos.id>MAX(usuarios_modulos.id)

Saludos
Gildus
__________________
.: Gildus :.
  #7 (permalink)  
Antiguo 23/12/2009, 17:55
Avatar de CdG
CdG
 
Fecha de Ingreso: marzo-2008
Mensajes: 114
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: maximos de un SELECT

hola jurena,

Para hacer la consulta quite el ORDER BY:
Código MySQL:
Ver original
  1. SELECT * FROM usuarios_modulos
  2. LEFT JOIN modulos
  3. ON modulos.id = usuarios_modulos.id_modulo
  4. WHERE usuarios_modulos.id_usuario = id
  5. GROUP BY id_modulo HAVING MAX(usuarios_modulos.id)

Como le decía gildus me devuelve el primer grupo de id_modulo y no los últimos.
También probé usuarios_modulos.id > MAX(usuarios_modulos.id).
Buena idea, pero en este caso la consulta viene vacía.

Un poco pensando en lo que me propusognzsoloyo y jurena escribí la consulta así y funciona:

Código MySQL:
Ver original
  1. SELECT * FROM usuarios_modulos
  2. LEFT JOIN modulos
  3. ON modulos.id = usuarios_modulos.id_modulo
  4. WHERE usuarios_modulos.id IN
  5. (SELECT MAX(usuarios_modulos.id) FROM usuarios_modulos WHERE id_usuario = id GROUP BY id_modulo)

Aunque sigo sin entender porque la de gildus no funciona
Leí que en lo posible hay que evitar anidar SELECT. ¿Se podrá optimizar la consulta?

gracias por todo!
__________________
no quiero ser un árbol y caminar
Jacinto Piedra
  #8 (permalink)  
Antiguo 24/12/2009, 02:51
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: maximos de un SELECT

Creo que la de gildus no funciona porque el HAVING se analiza después de hacer el group by, y una vez hecho el group by ya sólo te quedan los primeros almacenados de cada grupo, puesto que no has dado un orden. Por eso no entiendo por qué has eliminado el order by de la propuesta que te hice. En él radica la 'trampa'. Buscas todos y ordenas descendente por el campo del que quieres el máximo; luego seleccionas los datos de esa consulta pero agrupando por el campo que no quieres que se repita, y de ese modo obtendrás, creo, lo que quieres. Lo que no sé es si será más rápido que lo que haces ahora.
  #9 (permalink)  
Antiguo 27/12/2009, 16:43
Avatar de CdG
CdG
 
Fecha de Ingreso: marzo-2008
Mensajes: 114
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: maximos de un SELECT

jurena, clarísimo. Así quedo resuelto:

Código MySQL:
Ver original
  1. SELECT * FROM (SELECT usuarios_modulos.id,id_usuario,id_modulo,modulo,menu... FROM modulos
  2. LEFT JOIN usuarios_modulos
  3. ON modulos.id = usuarios_modulos.id_modulo
  4. WHERE usuarios_modulos.id_usuario = 3 ORDER BY usuarios_modulos.id DESC)usuarios_modulos
  5. GROUP BY id_modulo

ó

Código MySQL:
Ver original
  1. SELECT * FROM usuarios_modulos
  2. LEFT JOIN modulos
  3. ON modulos.id = usuarios_modulos.id_modulo
  4. WHERE usuarios_modulos.id IN
  5. (SELECT MAX(usuarios_modulos.id) FROM usuarios_modulos WHERE id_usuario = id GROUP BY id_modulo)

gracias!
__________________
no quiero ser un árbol y caminar
Jacinto Piedra
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:05.