Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: 50l3r en 23 Marzo 2010, 15:58 pm



Título: Ayuda con sentencia sql
Publicado por: 50l3r en 23 Marzo 2010, 15:58 pm
Veran, tengo que realizar la siguiente sentencia ero no se me ocurre como:

hallar el numero maximo de partidos ganados por cada equipo añadiendo el nombre del equipo y ordenar el resultado decrecientemente por el nº de partidos ganados

el ej dice que se puede utilizar "union all"

estas son las tablas que poseo, os hago un describe:


mysql> describe equipos
    -> ;
+-------------------+-------------+------+-----+---------+----------------+
| Field             | Type        | Null | Key | Default | Extra          |
+-------------------+-------------+------+-----+---------+----------------+
| registro          | int(11)     | NO   | PRI | NULL    | auto_increment |
| nombre            | varchar(30) | NO   | MUL | NULL    |                |
| nombre_entrenador | varchar(35) | NO   |     | NULL    |                |
| nombre_cancha     | varchar(30) | NO   |     | NULL    |                |
| poblacion         | varchar(25) | NO   |     | NULL    |                |
| anio_fundacion    | int(4)      | NO   |     | NULL    |                |
| anotaciones       | blob        | YES  |     | NULL    |                |
+-------------------+-------------+------+-----+---------+----------------+


mysql> describe partidos;
+-------------------+---------+------+-----+---------+----------------+
| Field             | Type    | Null | Key | Default | Extra          |
+-------------------+---------+------+-----+---------+----------------+
| registro          | int(11) | NO   | PRI | NULL    | auto_increment |
| id_equipo         | int(11) | NO   |     | NULL    |                |
| resultado_equipo1 | int(11) | NO   |     | NULL    |                |
| id_equipo2        | int(11) | NO   |     | NULL    |                |
| resultado_equipo2 | int(11) | NO   |     | NULL    |                |
+-------------------+---------+------+-----+---------+----------------+


yo creo que es casi imposible, no se me ocurre como :S


Título: Re: Ayuda con sentencia sql
Publicado por: ^Tifa^ en 23 Marzo 2010, 17:14 pm
No es imposible  ;)

Mira, te dare una pista para estos tipos de casos. En tu situacion deberas hacer un JOIN si usas el UNION te saldria 1 sola fila con los resultados de ambas tablas y no podras saber cuales pertenecen a una o cuales a la otra tabla  :xD

para obtener pos el maximo de partidos ganados por cada equipo seria algo como:

SELECT MAX(anotaciones) FROM equipos GROUP BY (nombre) ORDER BY nombre DESC

Siempre y cuando anotaciones sean partidos ganados, y nombre sea el nombre del equipo.

Harias algo similar en la otra tabla para obtener lo mismo  ;)  si te funciona (ya que no lo he probado) pasa la info para entonces hacer un JOIN de las dos.


Título: Re: Ayuda con sentencia sql
Publicado por: Shell Root en 23 Marzo 2010, 17:16 pm
Es posible, pero es mejor usar Store Procedure!

Consulta sobre funciones como... MAX(), COUNT(), INNER JOIN, DESC, ASC.


Título: Re: Ayuda con sentencia sql
Publicado por: seba123neo en 24 Marzo 2010, 02:37 am
y donde esta la relacion de esas 2 tablas..??  :o :o deberia tener un idequipo sino es imposible saber el nombre de un equipo dado un ID...

saludos.


Título: Re: Ayuda con sentencia sql
Publicado por: ^Tifa^ en 24 Marzo 2010, 13:46 pm
Citar
y donde esta la relacion de esas 2 tablas..??

Visualmente, pareciera que el campo registro es su indice de relacion entre las dos tablas  ;)  pero si por lo menos el detallase si la consulta SQL le funcionase, se pudiera continuar ayudando y armarle un JOIN de las dos tablas...  :P


Título: Re: Ayuda con sentencia sql
Publicado por: ssccaann43 © en 24 Marzo 2010, 14:24 pm
yo creo que es casi imposible, no se me ocurre como :S

Mi punto de vista...!

Presumo que Registro en la tabla equipo es el indice de dicha tabla. Pero asi mismo id_equipo1 e id_equipo2 debe estar relacionado con ese Registro que tienes en la tabla equipo. Ahora bien.

Si anotaciones es el número de partidos ganados, pues con el query de Tifa te resuelves. Si no es asi, pues debes hacer par de select. Por ejemplo:

Lo primero que debemos hacer es relacionar la tabla Equipos con Partidos. Yo particularmente lo hago de la siguiente manera. Nota: Aunque uso SQL Server, debe ser igual.

Código
  1.  
  2. CREATE VIEW VISTA
  3. AS
  4. SELECT  partidos.id_equipo, Equipos.nombre AS PRIMER_EQUIPO, partidos.id_equipo2, Equipos_1.nombre AS SEGUNDO_EQUIPO,
  5. partidos.resultado_equipo1, partidos.resultado_equipo2
  6. FROM Equipos INNER JOIN
  7. partidos ON Equipos.registro = partidos.id_equipo INNER JOIN
  8. Equipos Equipos_1 ON partidos.id_equipo2 = Equipos_1.registro
  9.  
  10.  

Imagen:
(http://r.i.elhacker.net/cache?url=http://www.imagechicken.com/uploads/1269443407061020700.jpg)

Luego lo que debo es hacer un select a dicha vista donde visualizo a los equipos y las veces ganadas...

Código
  1.  
  2. SELECT     (CASE WHEN RESULTADO_EQUIPO1 > RESULTADO_EQUIPO2 THEN PRIMER_EQUIPO ELSE SEGUNDO_EQUIPO END) AS GANADOR,
  3.                      COUNT((CASE WHEN RESULTADO_EQUIPO1 > RESULTADO_EQUIPO2 THEN PRIMER_EQUIPO ELSE SEGUNDO_EQUIPO END))
  4.                      AS Total_Ganados
  5. FROM         VISTA1
  6. GROUP BY (CASE WHEN RESULTADO_EQUIPO1 > RESULTADO_EQUIPO2 THEN PRIMER_EQUIPO ELSE SEGUNDO_EQUIPO END)
  7.  
  8.  

(http://r.i.elhacker.net/cache?url=http://www.imagechicken.com/uploads/1269443747031227100.jpg)

Resuelto...!  ;-)


PD.: Allí no tomo en cuenta un EMPATE... Ojo con eso...! Pero ya tienes una respuesta a tú duda... Saludos a mi bella Tifa...!


Título: Re: Ayuda con sentencia sql
Publicado por: 50l3r en 24 Marzo 2010, 14:34 pm
tengo un indice en la tabla equipos del campo nombre, para por ejemplo sacar el nombre en la tabla partidios hago un inner join:
Código
  1. SELECT e1.nombre equipo1,e2.nombre equipo2,avg(resultado_equipo1 + resultado_equipo2) AS media FROM partidos  p INNER JOIN equipos e1 ON p.id_equipo=e1.registro INNER JOIN equipos e2 ON p.id_equipo2=e2.registro GROUP BY id_equipo;
  2.  

ahi saco por ejemplo la media de puntos de cada partido jugado, y uso inner join para coger el nombre del equipo


Título: Re: Ayuda con sentencia sql
Publicado por: ssccaann43 © en 24 Marzo 2010, 15:16 pm
Rejueeerto..!


Título: Re: Ayuda con sentencia sql
Publicado por: ^Tifa^ en 24 Marzo 2010, 15:20 pm
Mientras mas leo... menos entiendo lo que se esta solicitando  ::)  que alguien me explique.


Título: Re: Ayuda con sentencia sql
Publicado por: ssccaann43 © en 24 Marzo 2010, 15:22 pm
Yo presumo que tiene un chapuzon de dudas y confusiones, creo que con mi post resuelve su duda...!


Título: Re: Ayuda con sentencia sql
Publicado por: ^Tifa^ en 24 Marzo 2010, 17:33 pm
Citar
Yo presumo que tiene un chapuzon de dudas y confusiones, creo que con mi post resuelve su duda...!

Ojala sea asi  :rolleyes:  porque particularmente yo... he entendido muy poco sus respuestas y lo que anda solicitando.


Título: Re: Ayuda con sentencia sql
Publicado por: ssccaann43 © en 25 Marzo 2010, 16:20 pm
tengo un indice en la tabla equipos del campo nombre, para por ejemplo sacar el nombre en la tabla partidios hago un inner join:
Código
  1. SELECT e1.nombre equipo1,e2.nombre equipo2,avg(resultado_equipo1 + resultado_equipo2) AS media FROM partidos  p INNER JOIN equipos e1 ON p.id_equipo=e1.registro INNER JOIN equipos e2 ON p.id_equipo2=e2.registro GROUP BY id_equipo;
  2.  

ahi saco por ejemplo la media de puntos de cada partido jugado, y uso inner join para coger el nombre del equipo


Nos gustaria que nos informes si resolviste tu duda...! Saludos


Título: Re: Ayuda con sentencia sql
Publicado por: 50l3r en 25 Marzo 2010, 16:48 pm
nada aun no, si la resuelvo os lo hago saber

es un curso de php y me esta resultando un poco dificilillo, y luego viene el avanzado  :o


se nota que es del gobierno jeje


Título: Re: Ayuda con sentencia sql
Publicado por: ^Tifa^ en 25 Marzo 2010, 19:02 pm
Nope la peticion en si no esta dificil  ;)  el problema es que al menos yo no entiendo del todo tu peticion, pero guiandome de tus ejemplos mostrados al inicio, cree 2 tablas con la informacion que quieres obtener al final;

Código
  1.  
  2. mysql> SELECT * FROM partidos;
  3. +----------+-------------------+
  4. | registro | resultado_equipo1 |
  5. +----------+-------------------+
  6. |        1 |                60 |
  7. |        2 |                80 |
  8. |        1 |                40 |
  9. |        2 |                30 |
  10. |        3 |                15 |
  11. +----------+-------------------+
  12. 5 ROWS IN SET (0.01 sec)
  13.  
  14. mysql> SELECT * FROM equipos;
  15. +----------+---------------+
  16. | registro | nombre        |
  17. +----------+---------------+
  18. |        1 | Los rojos     |
  19. |        2 | Los Azules    |
  20. |        1 | Los rojos     |
  21. |        3 | Los Amarillos |
  22. |        2 | Los Azules    |
  23. +----------+---------------+
  24. 5 ROWS IN SET (0.00 sec)
  25.  
  26.  
  27.  

Citar
hallar el numero maximo de partidos ganados por cada equipo añadiendo el nombre del equipo y ordenar el resultado decrecientemente por el nº de partidos ganados


Ahora, tu enunciado dice, que encuentre el total de partidos ganados por equipo, y diga cuales fueron esos equipos y el resultado final los ordene de manera descendente? entonces seria algo tipo:

Código
  1.  
  2. mysql> SELECT MAX(resultado_equipo1) AS Partidos_Ganados, nombre AS Equipo  FROM  partidos JOIN equipos ON equipos.registro = partidos.registro GROUP BY partidos.registro ORDER BY nombre DESC;
  3. +------------------+---------------+
  4. | Partidos_Ganados | Equipo        |
  5. +------------------+---------------+
  6. |               60 | Los rojos     |
  7. |               80 | Los Azules    |
  8. |               15 | Los Amarillos |
  9. +------------------+---------------+
  10. 3 ROWS IN SET (0.00 sec)
  11.  
  12.  


Título: Re: Ayuda con sentencia sql
Publicado por: ssccaann43 © en 25 Marzo 2010, 19:59 pm
Tifa bella, el dice: hallar el numero maximo de partidos ganados por cada equipo añadiendo el nombre del equipo y ordenar el resultado decrecientemente por el nº de partidos ganados

Por tal motivo, debe ir la cantidad que ha ganado y ordenarlo...! Así como lo muestro en las imagenes...! Verifica mis Querys en MySQL, porque lo arme en SQL Server, si te funcionan a ti, pues a el debería funcionarle, aunque es lo mismo... No entiendo porque se le complica la cosa, si es tan simple..!


Título: Re: Ayuda con sentencia sql
Publicado por: 50l3r en 25 Marzo 2010, 22:11 pm
max() te saca todos los registros o unicamente el maximo?

porcierto, ya me pasaron el ejercicio como bueno, pero aun asi, me intrigaria saber como se hace, siempre sea por saber mas :)


Título: Re: Ayuda con sentencia sql
Publicado por: ssccaann43 © en 25 Marzo 2010, 22:57 pm
MAX(CAMPO) Te saca el valor maximo y depende de la condición para que te muestre uno, o varios registros...! Leete un manual, hay muchos en la web...!


Título: Re: Ayuda con sentencia sql
Publicado por: ^Tifa^ en 26 Marzo 2010, 00:30 am
Hola ssscaann43.

No digo que tu idea este equivocada, porque puede ser funcional... yo ofreci un ejemplo que podia ayudarlo , mas no una solucion, ya que yo desconozco totalmente los registros existentes en las tablas para tener una idea mas organizada que datos esta el solicitando. Estoy adivinando acorde a la estructura de tablas que el ofrecio, y imagine que el campo resultado_equipo1 era el campo que guarda los juegos ganados por temporada  ;)

Yo coloque como campo de cantidad de partidos ganados resultado_equipo1  hay salen varios valores, segun de partidos ganados por distintas temporadas 40, 50, 60, 10, etc. Entonces esa seria la cantidad de juegos ganados por equipos usando de relacion el campo registro existente en ambas tablas.

Entonces los nombres de los equipos en mi ejemplo son el campo nombre de la tabla Equipos, en mi caso se repiten varias veces los equipos como podras ver, porque han jugado y ganado en diferentes temporadas  ;)

Entonces si lo anterior es valido, para sacar el maximo de partidos ganados por temporada de cada equipo, se haria la consulta SQL que hice, y que te lanza de resultado la cantidad de juegos mayor ganada por equipo, y el nombre del respectivo equipo que la gano:

Citar
+------------------+---------------+
| Partidos_Ganados | Equipo        |
+------------------+---------------+
|               60 | Los rojos     |
|               80 | Los Azules    |
|               15 | Los Amarillos |
+------------------+---------------+


Si te fijas, el equipo "Los Rojos" jugaron 2 temporadas, en una ganaron 40 juegos y en la otra 60 juegos, miralo en la tabla:

Citar
mysql> SELECT * FROM partidos;
+----------+-------------------+
| registro | resultado_equipo1 |
+----------+-------------------+
|        1 |                60 |
|        2 |                80 |
|        1 |                40 |
|        2 |                30 |
|        3 |                15 |
+----------+-------------------+
5 rows IN SET (0.01 sec)
 
mysql> SELECT * FROM equipos;
+----------+---------------+
| registro | nombre        |
+----------+---------------+
|        1 | Los rojos     |
|        2 | Los Azules    |
|        1 | Los rojos     |
|        3 | Los Amarillos |
|        2 | Los Azules    |
+----------+---------------+
5 rows IN SET (0.00 sec)


El campo que sirve de relacion en mi ejemplo es registro entonces, el Equipo "Los Rojos" jugo 2 temporadas donde la cantidad mayor de juegos ganados es 60  ;)  descartando donde ellos mismos ganaron 40 partidos....

50l3r

La funcion MAX en SQL obtiene precisamente el numero mayor o maximo existente en un campo de la tabla. Utilize GROUP BY para indicar que me sacara el numero mayor de partidos jugados por cada Equipo... y ese fue el resultado final, el que postee anteriormente.


Título: Re: Ayuda con sentencia sql
Publicado por: ssccaann43 © en 26 Marzo 2010, 01:14 am
Mi linda, es que tienes razón en lo que dices. Pero bueno quizas yo malinterprete lo que este chico quiere, pero a decir verdad "ni el sabe que quiere"...

Ya tiene 2 soluciones, la tuya que le muestra la cantidad de juegos mayor ganada por equipo, y el nombre del respectivo equipo que la gano.... Y la mia que le muestra el equipo con más juegos ganados todo ordenado...! Ya el decidira que opcion tomar...!


Título: Re: Ayuda con sentencia sql
Publicado por: 50l3r en 26 Marzo 2010, 15:32 pm
haber, si al sentencia es muy facil, que si se lo que quiero mira

hayar el maximo numero de partidos ganados por cada equipo, y que te salga el nombre del equipo, y que esten ordenados, que eso es facil


Título: Re: Ayuda con sentencia sql
Publicado por: ^Tifa^ en 26 Marzo 2010, 17:29 pm
Pero 50l3r  si ya te hemos expuestos 2 ejemplos de lo que buscabas  :xD  :xD  :xD


Título: Re: Ayuda con sentencia sql
Publicado por: 50l3r en 26 Marzo 2010, 17:36 pm
Hola ssscaann43.

No digo que tu idea este equivocada, porque puede ser funcional... yo ofreci un ejemplo que podia ayudarlo , mas no una solucion, ya que yo desconozco totalmente los registros existentes en las tablas para tener una idea mas organizada que datos esta el solicitando. Estoy adivinando acorde a la estructura de tablas que el ofrecio, y imagine que el campo resultado_equipo1 era el campo que guarda los juegos ganados por temporada  ;)

Yo coloque como campo de cantidad de partidos ganados resultado_equipo1  hay salen varios valores, segun de partidos ganados por distintas temporadas 40, 50, 60, 10, etc. Entonces esa seria la cantidad de juegos ganados por equipos usando de relacion el campo registro existente en ambas tablas.

Entonces los nombres de los equipos en mi ejemplo son el campo nombre de la tabla Equipos, en mi caso se repiten varias veces los equipos como podras ver, porque han jugado y ganado en diferentes temporadas  ;)

Entonces si lo anterior es valido, para sacar el maximo de partidos ganados por temporada de cada equipo, se haria la consulta SQL que hice, y que te lanza de resultado la cantidad de juegos mayor ganada por equipo, y el nombre del respectivo equipo que la gano:

Citar
+------------------+---------------+
| Partidos_Ganados | Equipo        |
+------------------+---------------+
|               60 | Los rojos     |
|               80 | Los Azules    |
|               15 | Los Amarillos |
+------------------+---------------+


Si te fijas, el equipo "Los Rojos" jugaron 2 temporadas, en una ganaron 40 juegos y en la otra 60 juegos, miralo en la tabla:

Citar
mysql> SELECT * FROM partidos;
+----------+-------------------+
| registro | resultado_equipo1 |
+----------+-------------------+
|        1 |                60 |
|        2 |                80 |
|        1 |                40 |
|        2 |                30 |
|        3 |                15 |
+----------+-------------------+
5 rows IN SET (0.01 sec)
 
mysql> SELECT * FROM equipos;
+----------+---------------+
| registro | nombre        |
+----------+---------------+
|        1 | Los rojos     |
|        2 | Los Azules    |
|        1 | Los rojos     |
|        3 | Los Amarillos |
|        2 | Los Azules    |
+----------+---------------+
5 rows IN SET (0.00 sec)


El campo que sirve de relacion en mi ejemplo es registro entonces, el Equipo "Los Rojos" jugo 2 temporadas donde la cantidad mayor de juegos ganados es 60  ;)  descartando donde ellos mismos ganaron 40 partidos....

50l3r

La funcion MAX en SQL obtiene precisamente el numero mayor o maximo existente en un campo de la tabla. Utilize GROUP BY para indicar que me sacara el numero mayor de partidos jugados por cada Equipo... y ese fue el resultado final, el que postee anteriormente.

pero lo que tu me estas sacando aqui, no es la cantidad de partidos ganados, sino los puntos no?, por lo que veo

porque los rojos no ganaron 60 partidos


Título: Re: Ayuda con sentencia sql
Publicado por: ^Tifa^ en 26 Marzo 2010, 17:51 pm
Citar
pero lo que tu me estas sacando aqui, no es la cantidad de partidos ganados, sino los puntos no?, por lo que veo

porque los rojos no ganaron 60 partidos

Nope, realmente mi ejemplo se basaba como si "Los Rojos" en una temporada ganaron 60 juegos, y en otra temporada ganaron 40 juegos... lo que hace el desconocimiento chico  ;)  lamentablemente, no es solamente colocar la estructura fisica de tus tablas... sino el contenido que tiene dentro, para tener las ideas mas claras de como sacar lo que estas buscando. Porque estructuralmente, uno puede imaginarse muchas cosas y asumir muchas cosas cuando la tuya tiene otra forma...

Ahora si te fijaste en el ejemplo de ssccaann43   aqui el te mostro como resultado, los equipos con mas juegos ganados, y el nombre de los equipos que ganaron dichos juegos... me parece que eso es lo que finalmente estas solicitando. Como el mismo te ha dicho no es una peticion dificil ni complicada, pero es normal la existencia de conocimientos cuando solo podemos ver la parte fisica de modelo de unas tablas...  :P


Título: Re: Ayuda con sentencia sql
Publicado por: 50l3r en 26 Marzo 2010, 18:05 pm
ya, la verdad partiendo de una idea es un poco abstracto, pero gracias, solucionado  ;-)


Título: Re: Ayuda con sentencia sql
Publicado por: ssccaann43 © en 26 Marzo 2010, 20:13 pm
Thkns God...! XD