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

Como realizar esta consulta

Estas en el tema de Como realizar esta consulta en el foro de Mysql en Foros del Web. Hola tengo esta consulta que me muestra un ranking ordenado por la puntuación de los usuarios y también muestra el nombre del usuario y su ...
  #1 (permalink)  
Antiguo 15/10/2011, 18:43
 
Fecha de Ingreso: abril-2002
Mensajes: 186
Antigüedad: 22 años
Puntos: 2
Como realizar esta consulta

Hola tengo esta consulta que me muestra un ranking ordenado por la puntuación de los usuarios y también muestra el nombre del usuario y su posición.
Lo que necesito que que solo tenga en cuenta los registros de la tabla ranking cuyo IdTest tenga un IdFamilias=x
Lo he intentado poniendo un inner join a la tabla test y luego poniendo un WHERE IdFamilias=x pero no me funciona debido a la clausula GROUP BY.

Alguna sugerencia o comentario que me pueda servir de ayuda??


SELECT Usuario, IdUsuario, sum( `Puntos` ) AS SumaDePuntos
FROM `ranking`
INNER JOIN usuarios ON usuarios.Id = ranking.IdUsuario
GROUP BY IdUsuario
ORDER BY SumaDePuntos DESC

Adjunto estructura de tablas reducidas
Gracias de antemano y un saludo.



CREATE TABLE IF NOT EXISTS `ranking` (
`Id` int(11) NOT NULL auto_increment,
`IdUsuario` int(11) NOT NULL,
`IdTest` int(11) NOT NULL,
`TipoTest` int(11) NOT NULL,
`Fecha` int(11) NOT NULL,
`Puntos` int(11) NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=132 ;



CREATE TABLE IF NOT EXISTS `test` (
`Id` int(11) NOT NULL auto_increment,
`Titulo` varchar(50) NOT NULL,
`TipoTest` int(11) NOT NULL ,
`IdFamilias` int(11) NOT NULL
KEY `Id` (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=179 ;

CREATE TABLE IF NOT EXISTS `test` (
`Id` int(11) NOT NULL auto_increment,
`Titulo` varchar(50) NOT NULL,
`TipoTest` int(11) NOT NULL ,
`IdFamilias` int(11) NOT NULL
KEY `Id` (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=179 ;



CREATE TABLE IF NOT EXISTS `testfamilias` (
`Id` int(11) NOT NULL auto_increment,
`Nombre` varchar(50) NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
  #2 (permalink)  
Antiguo 15/10/2011, 18:52
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Como realizar esta consulta

No nos dijiste cual es la relación entre `test` y `ranking`. Como el campo en comun que veo es TipoTest, asumire que esa es la relacion.
Código SQL:
Ver original
  1. SELECT Usuario, IdUsuario, SUM( `Puntos` ) AS SumaDePuntos
  2. FROM `ranking`
  3. INNER JOIN usuarios ON usuarios.Id = ranking.IdUsuario
  4. INNER JOIN test ON test.TipoTest = ranking.TipoTest
  5. WHERE test.IdFamilias = 1
  6. GROUP BY IdUsuario
  7. ORDER BY SumaDePuntos DESC
  #3 (permalink)  
Antiguo 15/10/2011, 22:16
 
Fecha de Ingreso: abril-2002
Mensajes: 186
Antigüedad: 22 años
Puntos: 2
Respuesta: Como realizar esta consulta

Hola gracias por responder.
No me funciona ya que la SumaDePuntos da unos valores muy altos.
Me da 180 cuando debería de dar 23.
Voy a seguir investigando.
  #4 (permalink)  
Antiguo 16/10/2011, 17:28
 
Fecha de Ingreso: abril-2002
Mensajes: 186
Antigüedad: 22 años
Puntos: 2
Respuesta: Como realizar esta consulta

Hola si que funciona perfectamente solo tenia que cambiar la línea INNER JOIN test ON test.TipoTest = ranking.TipoTest por esta otra INNER JOIN test ON test.Id = ranking.IdTest

Yo solo me he liado ya que esto mismo es que intenté hacer al principio.
Mucha gracias.

SELECT Usuario, IdUsuario, sum( `Puntos` ) AS SumaDePuntos
FROM `ranking`
INNER JOIN usuarios ON usuarios.Id = ranking.IdUsuario
INNER JOIN test ON test.Id = ranking.IdTest
WHERE test.IdFamilias = 1
GROUP BY IdUsuario
ORDER BY SumaDePuntos DESC
  #5 (permalink)  
Antiguo 18/10/2011, 12:58
 
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 14 años, 8 meses
Puntos: 10
Respuesta: Como realizar esta consulta

Te aconsejo FUERTEMENTE uses ALIAS ("as") para las tablas tambien para evitar "liarte"

Al menos a mi me parece MUCHO mas simple algo asi:

SELECT t1.* FROM TTTT AS t1
INNER JOIN TTTT AS t2 ON
t1.id_ = t2.id_
INNER JOIN TTTT AS t3 ON
t2.id_ = t3.id_
__________________
The best powerful search engine for MSN messenger profiles I know is msn profile viewer. It's really good either if you have an e-mail address or not. Try it!

Etiquetas: registros, select, tabla
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 15:27.