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

Como ordenar Group by

Estas en el tema de Como ordenar Group by en el foro de Bases de Datos General en Foros del Web. estoy intentando mostrar el ultimo ingreso de una mascota, haciendo una vista que luego se agrupa con un select pero siempre me muestra el mismo ...
  #1 (permalink)  
Antiguo 12/11/2010, 11:58
Avatar de zeuzft  
Fecha de Ingreso: junio-2009
Ubicación: peru
Mensajes: 358
Antigüedad: 14 años, 10 meses
Puntos: 2
Exclamación Como ordenar Group by

estoy intentando mostrar el ultimo ingreso de una mascota, haciendo una vista que luego se agrupa con un select pero siempre me muestra el mismo registro.

1.la vista
Cita:
create or replace view histo1 as select * from histoclini hc inner join mascota m on hc.mas_id_FK=m.mas_id inner join cliente c on m.cli_id_FK=c.cli_id inner join linea2 l2 on m.lin_id_FK2=l2.lin_id2 where his_id>0 order by his_id desc

2. el select para la vista
Cita:
select * from histo1 where his_pas<>1 group by mas_id_FK

pero como les digo siempre me muestra el mismo registro; aqui encontre un select que luego se agrupa con un inner join pero siempre el mismo resultado; muestra el 1er registro.
  #2 (permalink)  
Antiguo 12/11/2010, 12:25
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: Como ordenar Group by

Código MySQL:
Ver original
  1.     histoclini hc INNER JOIN
  2.     mascota m ON hc.mas_id_FK = m.mas_id INNER JOIN
  3.     cliente c ON m.cli_id_FK = c.cli_id
  4.     INNER JOIN linea2 l2 ON m.lin_id_FK2=l2.lin_id2
  5.     his_id>0
  6. ORDER BY his_id desc;
La sentencia sólo devuelve un registro porque en esas tablas sólo hay un registro donde una historia clínica pertenezca a una mascota y esa mascota pertenezca a un cliente.
Esto puede darse por dos razones:
- No hay más que un conjunto que cumpla con la identidad establecida por los INNER JOIN.
- No estás usando tablas InnoDB y por tanto estás metiendo incorrectamente los valores de FK en alguna de las tablas y el sistema no las puede relacionar.

En este caso no importa si agrupas o no. El problema es que sólo puede devolverte un registro porque hay un error de datos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 12/11/2010, 21:19
Avatar de zeuzft  
Fecha de Ingreso: junio-2009
Ubicación: peru
Mensajes: 358
Antigüedad: 14 años, 10 meses
Puntos: 2
Respuesta: Como ordenar Group by

no se a q te refieres con InnoDB; pero esa consulta me devuelve 2 registros.
Cita:
SELECT *
FROM
histoclini hc INNER JOIN
mascota m ON hc.mas_id_FK = m.mas_id INNER JOIN
cliente c ON m.cli_id_FK = c.cli_id
INNER JOIN linea2 l2 ON m.lin_id_FK2=l2.lin_id2
WHERE
his_id>0
ORDER BY his_id desc;
  #4 (permalink)  
Antiguo 13/11/2010, 05:20
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: Como ordenar Group by

Cita:
pero como les digo siempre me muestra el mismo registro; aqui encontre un select que luego se agrupa con un inner join pero siempre el mismo resultado; muestra el 1er registro.
A esto me refiero.
Tu problema es que el GROUP BY de esa sentencia no es suficientemente discriminante, porque ambos registros (los que devuelve la vista) tienen el mismo numero en mas_id_FK. Una consulta de ese tipo solamente te sirve para saber cuántas mascotas diferentes tienen una historia clínica, pero nada más.
De hecho, si la escribes así:
Código MySQL:
Ver original
  1. SELECT H.* , COUNT(*) CantMascotas
  2. FROM histo1 H
  3. GROUP BY  mas_id_FK;
verás que la columna CantMascotas devuelve un 2, lo que precisamente significa que está agrupando dos registros con igual mas_id_FK.

Sería más sencillo ayudarte si postearas la estructura de las tablas (viene bien para entender mejor el resultado esperable en la consulta) y nos dijeses exactamente qué es lo que estás buscando obtener en la segunda consulta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 13/11/2010, 14:00
Avatar de zeuzft  
Fecha de Ingreso: junio-2009
Ubicación: peru
Mensajes: 358
Antigüedad: 14 años, 10 meses
Puntos: 2
Respuesta: Como ordenar Group by

lo que intento hacer en la 2da consulta es que me muestre tan solo el ultimo ingreso de la mascota; es decir si la mascota tuvo 10 ingresos en 1 mes; me debe solo el mas reciente.
estructura de la tabla mascota:
Cita:
CREATE TABLE IF NOT EXISTS `mascota` (
`mas_id` int(11) NOT NULL auto_increment,
`mas_nombre` varchar(45) default NULL,
`cli_id_FK` int(11) NOT NULL,
`lin_id_FK1` int(11) NOT NULL COMMENT 'especie de mascota',
`lin_id_FK2` int(11) NOT NULL COMMENT 'raza de mascota',
`mas_fec_nac` date default NULL,
`mas_cod` char(12) default NULL,
`mas_desc` text NOT NULL,
`mas_sexo` varchar(9) default NULL,
`mas_pas` tinyint(4) default '0',
PRIMARY KEY (`mas_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
estructura de la tabla histoclini
Cita:
CREATE TABLE IF NOT EXISTS `histoclini` (
`his_id` int(11) NOT NULL auto_increment,
`mas_id_FK` int(11) default NULL,
`ex_id_FK` int(11) NOT NULL,
`his_ming` text collate utf8_unicode_ci NOT NULL,
`his_diag` text collate utf8_unicode_ci,
`his_fecing` date NOT NULL,
`his_fecsal` date NOT NULL,
`cod_ex` text collate utf8_unicode_ci COMMENT 'id de examenes',
`his_pas` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`his_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;
la tala cliente son los datos usuales solo, la utilizo para mostrar el nombre del propietario
  #6 (permalink)  
Antiguo 13/11/2010, 15:24
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: Como ordenar Group by

Fantástico, entonces lo que corresponde es buscar la máxima fecha de cada consulta y agruparlas por mascota...
El tema es que el ORDER BY debe ser posterior al GROUP BY, por lo que hay tres soluciones posibles: Ponerle el ORDER BY a la vista, hacer el ordenamiento en una subconsulta o usar MAX().
Con el ORDER BY en la vista lo único que cambiaría sería ella:
Código MySQL:
Ver original
  1.     histoclini hc INNER JOIN
  2.     mascota m ON hc.mas_id_FK = m.mas_id INNER JOIN
  3.     cliente c ON m.cli_id_FK = c.cli_id
  4.     INNER JOIN linea2 l2 ON m.lin_id_FK2=l2.lin_id2
  5.     his_id>0
  6. ORDER BY his_fecing, DESC, his_id DESC;
La consulta no cambiaría.

Con la subconsulta sería más o menos:
Código MySQL:
Ver original
  1. SELECT H.*
  2. FROM (SELECT * FROM histo1 ORDER BY his_fecing, DESC, his_id DESC) H
  3. GROUP BY  mas_id_FK;
Con MAX() hay que determinar cuáles son los campos a traer, porque sino traerás dos veces el mismo:
Código MySQL:
Ver original
  1.     mas_id,
  2.     mas_nombre,
  3.     cli_id_FK,
  4.     lin_id_FK1,
  5.     lin_id_FK2,
  6.     mas_fec_nac,
  7.     mas_cod,
  8.     mas_desc,
  9.     mas_sexo,
  10.     mas_pas,
  11.     his_id,
  12.     ex_id_FK,
  13.     his_ming,
  14.     his_diag,
  15.     MAX(his_fecing) his_fecing,
  16.     his_fecsal,
  17.     cod_ex,
  18.     his_pas
  19. FROM histo1
  20. GROUP BY  mas_id_FK;

Respecto a lo de InnoDB, lamento comunicarte que las tablas que usas no dan soporte a las claves foráneas, por lo que bien podrías ingresar una masconta 341 y ponerle en la historia clínica a esa mascota el 7834 y el sistema no podría evitarlo, simplemente porque las tablas MyISAM no tienen restricciones FOREIGN KEY. Lo que puede suceder es que le hayas puesto las cláusulas, pero el motor no las creó porque ese motor de tablas, como te digo, no tiene eso.
InnoDB es otro motor de tablas que MySQL puede usar y que desde la versión 5 es el motor por default. InnoDB si tiene restricciones de FK e incluso soporta transacciones, por lo que es un motor mucho más potente a la hora de crear bases de datos relacionales.
Todos los servicios que conozco y proveen soporte de MySQLQ tienen el InnoDB activado, pero no lo tienen definido como por default, porque en ciertos niveles el MyISAM es más rápido, especialmente con bases de gran nivel de inserciones/actualizaciones por hora. En esos casos los diseñadores sacrifican calidad por cantidad.

¿Se entiende el problema?

Espero que estos detalle ste ayuden

Saludos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: group
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 18:32.