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

como puedo hacer esta consulta

Estas en el tema de como puedo hacer esta consulta en el foro de Mysql en Foros del Web. Hola, escribi un tema en el foro de php que creo que va mejor aqui en mysql, el tema es este http://www.forosdelweb.com/f18/podei...4/#post2709587 el problema es ...
  #1 (permalink)  
Antiguo 17/12/2008, 11:19
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 19 años, 11 meses
Puntos: 0
como puedo hacer esta consulta

Hola, escribi un tema en el foro de php que creo que va mejor aqui en mysql, el tema es este http://www.forosdelweb.com/f18/podei...4/#post2709587

el problema es que la solucion no funciona, en teoria es una tabla que guarada las carreras de formula 1

tabla calendario
--------------------
id
tid (temporada)
piloto1
puntos_pioto1
piloto2
puntos_piloto2
piloto3
puntos_piloto3
.... asi hasta el 8

guarda el nombre del piloto, y los puntos que tiee en esa carrera, hasta aqui todo bien, el problema que que quiero hacer una tabla con la clasificacion general, apra eso tiene que sumar todos los puntos que hizo un piloto en cada una de las carreras, en el post original la idea era hacer una consulta y hacer un where piloto1 es igual a nombre del piloto en la tabla piloto, pero cual es el problema, que piloto1 en la tabla calendario, tiene varios nombres de piloto, porque en una carrera gana uno y en otra otro, entocnes no la puedo comparar asi, no se si me explico.

Como podria hacerlo?
  #2 (permalink)  
Antiguo 17/12/2008, 11:44
 
Fecha de Ingreso: noviembre-2008
Ubicación: San Vicente (Alicante)
Mensajes: 21
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: como puedo hacer esta consulta

en mi opinión, creo que no metes los datos correctos en la tabla calendario. creo que te sobran los 8 pilotos y las 8 puntuaciones de esa tabla. yo en tu lugar, me crearia una tabla que se llamara Carrera que tuviera dos campos (piloto y puntuación), y en la tabla Calendario (el id, el tid y otro identificador de Carrera). Ahora si que podrías hacer bien la consulta con el where piloto porque te buscara el piloto en cuestión en la tabla Carrera y te devolverá su puntuación en esa carrera. Espero que el cambio no te suponga mucho lío.

Un saludo!!! ^_^
  #3 (permalink)  
Antiguo 17/12/2008, 11:49
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: como puedo hacer esta consulta

si entiendo, o eso creo, lo que quieres decir es que cree la otra tabla solo con esos dos campos y al guardar los datos de cada carrera de quien ha ganado lo guarde en la nueva tabla y sume automaticamente los puntos que le corresponde al piloto? seria algo asi o es que yo ya me imagine otra cosa? jajaja perdona pero es que esto ya me tiene mareado.

Porque lo que yo quiero es buscar la clasificacion gneral de cada piloto con los puntos que ha ganado en cada carrera, da igual que me muestre la carrera o no, lo que quiero mostrar es una tabla donde aparezca el nombre del piloto y el total de los puntos que tiene en 10 carreras por ejemplo, independientemente si queda primero tercero o segundo
  #4 (permalink)  
Antiguo 17/12/2008, 12:11
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: como puedo hacer esta consulta

voy a intentar eso en una tabla con 2 campos aunque he pensdo que serian mejor 4 para poner la temporada y la carrera asi puedo saber que putos son de que temporada, pero tengi una pregunta, tengo que meter a los 8 primeros de una carrera en campo nombre y puntos, como puedo hacer el insert porque son solo 2 campos pero son 8 pilotos que hay que meter, y yo ahora lo hago es con un formulario donde pongo los nombres de los 8
  #5 (permalink)  
Antiguo 17/12/2008, 12:44
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: como puedo hacer esta consulta

Pakillo,
estoy de acuerdo con Trumpetero. En mi opinión, la mejor solución implica esto:
Tablas:

equipos
id_equipo (PK)
equipo

pilotos
id_piloto (PK)
piloto
refidequipo (FK)
edad
...

carreras
id_carrera (PK)
carrera
fecha
temporada
...

clasificaciones
id_clasificaciones (PK)
refidcarrera(FK)
refidpiloto (FK)
refidposicion (FK)


puntosposicion
id_posicion (PK)
puntos int

Naturalmente, puedes añadir otras e incluso eliminar la tabla puntosposicion y añadir en clasificaciones un campo puntos, como te recomendaba trumpetero.


Por cada uno de los 8 primeros de cada carrera insertas un registro en la tabla clasificaciones con los datos indicados. Puedes poner las posiciones de todos los que terminen, aunque ello no conlleve puntos (conviene guardar datos que luego puedas presentar en la estadística), pues no es lo mismo terminar el noveno que el undécimo. Naturalmente, añades campos en la tabla puntosposicion con 0 puntos para esas otras clasificaciones. E incluso añadir un valor para los que no terminen, aunque eso lo podrías sacar de otro modo.

Luego, por ponerte un ejemplo, una consulta como esta de más abajo te sacará la clasificación de los que intervinieron en la segunda carrera. En el where puedes poner los datos que quieras, año, temporada, etc. O no poner nada y te sumará el total.
Además, luego podrás casi todo lo que se te ocurra con los datos. He puesto la tabla de puntosposicion para el caso de que esos puntos sean siempre los mismos para cada posición, pero, como te he dicho, puedes incluir los puntos en la tabla clasificaciones y evitarte esta tabla.


Código sql:
Ver original
  1. SELECT p.piloto, SUM( pp.puntos ) puntos
  2. FROM `clasificaciones` cl
  3. INNER JOIN pilotos p ON cl.refidpiloto = p.id_piloto
  4. INNER JOIN carreras ca ON cl.refidcarrera = ca.id_carrera
  5. INNER JOIN puntosposicion pp ON pp.id_posicion = cl.refidposicion
  6. WHERE ca.id_carrera =2
  7. GROUP BY p.id_piloto
  8. ORDER BY puntos DESC

Última edición por jurena; 18/12/2008 a las 03:55
  #6 (permalink)  
Antiguo 17/12/2008, 13:02
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: como puedo hacer esta consulta

umm creoq ue voy a montar unas tablas de pruba con lo que me dices porque, si te digo la verdad me estoy haciendo un lio, por lo que ya tengo echo, entonces creare unas tablas metere unos datos y hare la prueba, solo una pregunta que es lo que me tiene tambien un poco atascado, justamente esta parte

Cita:
Por cada uno de los 8 primeros de cada carrera insertas un registro en la tabla clasificaciones con los datos indicados.
Tengo que hacer los 8 inserts? perdona es que estoy empezando con mysql y claro aun no estoy bien puesto en el tema, imagino que hay alguna forma mas facil de hacer un insert, porque serian 8 o mas en los mismos campos de la tabla.
  #7 (permalink)  
Antiguo 17/12/2008, 13:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: como puedo hacer esta consulta

Con un INSERT múltiple te bastaría

imagina algo así, por ponerte sólo un ejemplo en que introduces los tres datos de clasificaciones, concretamente los tres primeros clasificados en la prueba 1, que son los pilotos 1, 3 y 6 respectivamente.

INSERT INTO clasificaciones (reficarrera, refidpiloto, refidposicion) VALUES (1,2,1), (1,3,2), (1,6,3)
etc.

Pero ahora ese no es el problema. Luego deberás hacerte tu formulario para la introducción de datos. Lo importante es armar una estructura relacional apropiada. No digo que esta que te propongo sea la mejor, pero creo que no es mala.

edito: además esa estructura te permitirá sacar fácilmente la clasificación por equipos si las hubiera, o mostrar cuántos primeros puestos, etc. ha conseguido cada piloto...

Última edición por jurena; 18/12/2008 a las 03:53
  #8 (permalink)  
Antiguo 18/12/2008, 09:36
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: como puedo hacer esta consulta

Hola Jurena una pregunta, lo del insert me funciona bien pero ahora bien la consulta no se como mostrarla, nunca he utilizado consultas asi y me esta costando un poco hasta par entenderla jejeje he estado mirando manuales de mysql pero todos lo dicen muy basico, he creado las tablas como me has dicho, de prueba para ver si asi lo compredo mejor, pero la verdad la consulta se me resiste :)
  #9 (permalink)  
Antiguo 18/12/2008, 10:12
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: como puedo hacer esta consulta

La consulta es muy simple. Lo que sucede es que quizás no estás acostumbrado a los cruces de tablas mediante INNER JOIN. Piensa que en cada una de las tablas hay un primary key y que en las demás tablas hay foreign keys, referidas a las primary keys de esas tablas. Un ejemplo, si la tabla equipo tiene un id_equipo que es primary key, auto_increment y todo lo demás, y pongamos por ejemplo que el equipo cuyo id_equipo es el equipo "pilotos del norte", todo piloto que pertenezca a ese equipo debe tener en la tabla pilotos el refidequipo con valor 1. Pues bien para traerte junto con el corredor el nombre de su equipo tendrás que hacer un INNER JOIN entre las tablas en el que el refidequipo de pilotos sea igual al id_equipos de equipo
eso lo haces así:


SELECT pilotos.piloto, equipos.equipo from pilotos inner join equipos on equipos.id_equipo = pilotos.refidequipo
y así con las demás...

Por lo demás, la consulta es una consulta mediante agrupación GROUP BY, que saca la suma de puntos SUM(puntos), pero con una restricción, que se refieren a la carrera 2, lo del WHERE...

Pero si tienes dificultades, dinos primero cómo has creado tus tablas y la naturaleza de los campos, para que con eso podamos ayudarte.
  #10 (permalink)  
Antiguo 18/12/2008, 17:22
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: como puedo hacer esta consulta

vale ya lo entiendo mas o menos, es verdad no estoy acostumbrado a ese tipo de consultas cruzando tablas, lo que hice fue crear las tablas que me has dicho de la forma que me has dicho, osea las que escribiste arriba, asi puedo probar las consultas, los datos los he metido a mano desde el phpmyadmin asi no creo formularios ni nada de eso y puedo ir probando, pero en realidad loq ue mas me interesa de todo esto es poder mostrar la clasificacion general, osea todos los los datos de las carreras y los puntos totales de cada piloto, para que te hagas una idea de lo que quiero es una tabla como esta http://www.thef1.com/gp-resultados eso es lo que me esta dando dolores de cabeza.
Porque a parte no sabria como mostrar los resultados asi, por columnas, si lo intento se repiten los nombres de pilotos todas las veecs que estan en la tabla clasificaciones, porque si son 3 carreras quiere decir que aparece 3 veces el piloto.

Lo que si hice de las tablas que has puesto, quite la de puntosposicion, y los puntos los guardo directamente en clasificaciones, quite el campo refidposicion por refidpuntos.

Última edición por pakillo; 18/12/2008 a las 17:28
  #11 (permalink)  
Antiguo 19/12/2008, 02:17
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: como puedo hacer esta consulta

Si no me he equivocado con los campos (no la he probado), esta consulta te sacará el orden de clasificación de la carrera cuyo id_carrera es 2.

Código sql:
Ver original
  1. SELECT p.piloto, SUM( cl.puntosposicion ) puntos
  2. FROM `clasificaciones` cl
  3. INNER JOIN pilotos p ON cl.refidpiloto = p.id_piloto
  4. INNER JOIN carreras ca ON cl.refidcarrera = ca.id_carrera WHERE ca.id_carrera =2
  5. GROUP BY p.id_piloto
  6. ORDER BY puntos DESC

Si quieres la suma total de todas las carreras
Código sql:
Ver original
  1. SELECT p.piloto, SUM( cl.puntosposicion ) puntos
  2. FROM `clasificaciones` cl
  3. INNER JOIN pilotos p ON cl.refidpiloto = p.id_piloto
  4. INNER JOIN carreras ca ON cl.refidcarrera = ca.id_carrera
  5. GROUP BY p.id_piloto
  6. ORDER BY puntos DESC

Si quieres las de un año o temporada

Código sql:
Ver original
  1. SELECT p.piloto, SUM( cl.puntosposicion ) puntos
  2. FROM `clasificaciones` cl
  3. INNER JOIN pilotos p ON cl.refidpiloto = p.id_piloto
  4. INNER JOIN carreras ca ON cl.refidcarrera = ca.id_carrera WHERE ca.temporada='2008-2009'
  5. GROUP BY p.id_piloto

Si por equipos
Código sql:
Ver original
  1. SELECT e.quipo, SUM( cl.puntosposicion ) puntos
  2. FROM `clasificaciones` cl
  3. INNER JOIN pilotos p ON cl.refidpiloto = p.id_piloto INNER JOIN equipos e ON p.refidequipo = e.id_equipo
  4. INNER JOIN carreras ca ON cl.refidcarrera = ca.id_carrera GROUP BY p.id_equipo
  5. ORDER BY puntos DESC

Y así...

Claro, esto te da el orden. Para ponerle 1º, 2º etc, yo te aconsejaría que lo hicieras con programación. Pero eso va después y la consulta la deberás hacer en el foro de tu programa.
  #12 (permalink)  
Antiguo 19/12/2008, 08:39
 
Fecha de Ingreso: mayo-2004
Mensajes: 400
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: como puedo hacer esta consulta

Gracias Jurena por el curro que te estoy dando,e stoy prbando las consultas pero en todas me sale el mismo error
MySQL Error: Unknown column 'cl.puntosposicion' in 'field list'

las tablas las tengo exactamente como las que has puesto arriba

equipos
id_equipo (PK)
equipo

pilotos
id_piloto (PK)
piloto
refidequipo (FK)
edad
...

carreras
id_carrera (PK)
carrera
fecha
temporada
...

clasificaciones
id_clasificaciones (PK)
refidcarrera(FK)
refidpiloto (FK)
refidposicion (FK)


puntosposicion
id_posicion (PK)
puntos int

haria pruebas pero como dije antes no tengo mucha experiencia con este tipo de consultas y no se lo que signifca por ejemplo el cl. etc, siento mucho ser tan pesado :(
  #13 (permalink)  
Antiguo 19/12/2008, 08:57
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: como puedo hacer esta consulta

Hola pakillo

Te está diciendo que por ningún lado, en la tabla "calificaciones" está el campo "puntosposicion" y efectivamente no la veo en tu tabla (al menos digitado).

Saludos
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #14 (permalink)  
Antiguo 19/12/2008, 09:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: como puedo hacer esta consulta

Es lo que dice Carxl.

Pakillo,
tú me dijiste en uno de tus posts anteriores
Cita:
Lo que si hice de las tablas que has puesto, quite la de puntosposicion, y los puntos los guardo directamente en clasificaciones, quite el campo refidposicion por refidpuntos.
imaginé que creaste un campo numérico en la tabla clasificaciones llamado puntosposicion, donde guardas los puntos. Creí que habías eliminado la tabla puntosposicion. Pero lo que es un error es quitar el campo refidposicion, pues lo necesitas, aunque no lo llames refidposicion, sino simplemente posicion. En él guardarás la posición con valor numérico: 1, 2, 3, 4, 5, 6, 7, 8, etc. hasta la última posición. En el campo puntosposicion, que será numérico tinyint(4), por ejemplo, sin permitir null y con default 0.

Si haces eso, creo que te servirán todas las consultas.

No te preocupes por tener que preguntar. Para eso está el foro.

Última edición por jurena; 22/12/2008 a las 12:31
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 07:54.