Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: Kasswed en 15 Diciembre 2009, 01:47 am



Título: Duda en consulta
Publicado por: Kasswed en 15 Diciembre 2009, 01:47 am
Hola.

Me ha surgido una duda realizando consultas.

Necesito que, partiendo de una lista de sumas, la consulta me saque las máximas (habrá una máxima o más si las sumas son iguales) pero no sé hacerlo. Le he dado ya un montón de vueltas hoy y no caigo.

También me gustaría hacer esto mismo con el máximo de AVG() o de COUNT()...

¿Alguna sugerencia?

Gracias.


Título: Re: Duda en consulta
Publicado por: дٳŦ٭ en 15 Diciembre 2009, 02:15 am
MAX()


Título: Re: Duda en consulta
Publicado por: Kasswed en 15 Diciembre 2009, 02:20 am
Gracias por tu respuesta, pero no me aclara nada.

Yo lo que quiero es usar MAX() en conjunto con las otras funciones, como SUM(), AVG() o COUNT().


Título: Re: Duda en consulta
Publicado por: дٳŦ٭ en 15 Diciembre 2009, 02:48 am
mm no pues no te entiendo, lo que podrías intentar es hacer un COUNT(MAX([campo])) o esperar a que alguien nos dé otra opinión.

Saludos.


Título: Re: Duda en consulta
Publicado por: fede_cp en 15 Diciembre 2009, 03:43 am
cita un ejemplo

saludos


Título: Re: Duda en consulta
Publicado por: Kasswed en 15 Diciembre 2009, 03:51 am
Imagina que tienes una tabla de usuarios y una tabla de posts.

En la tabla de usuarios información referente a usuarios como el id (primary key), nombre, la edad etc.

En la tabla de posts tienes la ID del usuario que postea (como foreign key de usuarios), la id del post, dónde postea (URL) y lo que postea.

Ahora quieres sacar el usuario que tiene el número máximo de posts en total.

Habría que contar los posts y de ahí sacar el máximo.

No se puede hacer con TOP o LIMIT porque puede haber varios usuarios con el mismo número de post y como máximos.

¿Cómo se haría?


Título: Re: Duda en consulta
Publicado por: fede_cp en 15 Diciembre 2009, 04:06 am
Un ejemplo hipotetico sería


Código
  1. <?php
  2. $con="SELECT MAX(id_post) FROM usuarios";
  3. $row=mysql_query($con, $conexion);
  4. $rrs=mysql_fetch_array($row);
  5. $con2="SELECT user from usuario WHERE id_post='".$rss["0"]."'";
  6. $row2=mysql_query($con2, $conexion);
  7. $rss=mysql_fetch_array(row2);
  8. echo $rss[0];
  9. ?>

algo asi se me ocurre

todavía nose si eso es lo que tenes pensado hacer :S

PD:no esta comprobado el codem porai hay algun error por ahi ;)

saludos


Título: Re: Duda en consulta
Publicado por: Kasswed en 15 Diciembre 2009, 04:22 am
Hola.

No entiendo muy bien el código PHP.

¿Podrías ponerla en lenguaje SQL "puro"?

Gracias.


Título: Re: Duda en consulta
Publicado por: fede_cp en 15 Diciembre 2009, 04:26 am
y seria

SELECT MAX(id_post) FROM usuarios-----primera variable
               ¡
         toma el maximo id

SELECT user from usuarios WHERE id_post=la variable anterior
          ¡
     a partir del maximo id, selecciona al usuario con el maximo id_post (que seria el numero de posts).


esas serian las consultas básicas


saludos



Título: Re: Duda en consulta
Publicado por: ^Tifa^ en 15 Diciembre 2009, 13:43 pm
Imagina este escenario basandome en lo que tu expones (Sobre tus 2 tablas usuarios y posts):

Código
  1.  
  2. mysql> SELECT * FROM usuarios;
  3. +----+--------+
  4. | id | nombre |
  5. +----+--------+
  6. |  1 | pepe   |
  7. |  2 | Mario  |
  8. |  3 | Maria  |
  9. |  4 | Juan   |
  10. |  5 | Jose   |
  11. +----+--------+
  12. 5 ROWS IN SET (0.00 sec)
  13.  
  14. mysql> SELECT * FROM post;
  15. +------+------+--------------------------+
  16. | id   | pid  | mensaje                  |
  17. +------+------+--------------------------+
  18. |    1 |    1 | Me gusta la lluvia       |
  19. |    1 |    1 | La vida es bella         |
  20. |    1 |    1 | Que pais visitar         |
  21. |    2 |    2 | Mi color favorito        |
  22. |    1 |    1 | Tu fruta favorita        |
  23. |    3 |    3 | Me gustan los viernes    |
  24. |    3 |    3 | Dia de mi cumple         |
  25. |    1 |    1 | Que computadora comprar? |
  26. |    1 |    1 | Mi laptop rosa           |
  27. |    4 |    4 | La manzana roja          |
  28. |    4 |    4 | Aprendiendo lotus        |
  29. |    4 |    4 | Viva Oracle              |
  30. |    4 |    4 | Tu comida preferida      |
  31. +------+------+--------------------------+
  32. 13 ROWS IN SET (0.00 sec)
  33.  
  34.  


Ahora quieres saber cuantos mensajes existen en la tabla post que hayan realizado cada usuario de la tabla usuarios.


Código
  1.  
  2. mysql> SELECT usuarios.nombre, COUNT(post.pid) FROM post INNER JOIN usu
  3. arios WHERE usuarios.id = post.id GROUP BY usuarios.id;
  4. +--------+-----------------+
  5. | nombre | COUNT(post.pid) |
  6. +--------+-----------------+
  7. | pepe   |               6 |
  8. | Mario  |               1 |
  9. | Maria  |               2 |
  10. | Juan   |               4 |
  11. +--------+-----------------+
  12. 4 ROWS IN SET (0.00 sec)
  13.  
  14.  

Ahora si tu proposito unicamente es saber que usuario es el que ha realizado la mayoria de posts:

Código
  1.  
  2.  
  3. mysql> SELECT usuarios.nombre, COUNT(post.pid) FROM post INNER JOIN usuarios whe
  4. re usuarios.id = post.id GROUP BY usuarios.id LIMIT 1;
  5. +--------+-----------------+
  6. | nombre | COUNT(post.pid) |
  7. +--------+-----------------+
  8. | pepe   |               6 |
  9. +--------+-----------------+
  10. 1 ROW IN SET (0.00 sec)
  11.  
  12.  


Título: Re: Duda en consulta
Publicado por: sempus en 15 Diciembre 2009, 16:19 pm

yo lo haria de esta forma, los campos se llaman distinto pero la idea se entiende

Código
  1. SELECT COUNT(codigo) veces, codigo FROM saldos GROUP BY codigo ORDER BY veces DESC
  2. variable = query.veces
  3. SELECT * FROM query WHERE veces = variable
  4.  
si ordeno el resultado de forma descendente, se que el primer registro del cursor sera el mayor o igual, entonces lo capturo en una  variable, luego hago una segunda consulta al resultado anterior y le filtro el campo veces, de este modo, no importara cuantas veces aparecezca, me lo tomara todas, nose si me di a entender xD

en una sola consulta creo que no se puede, lo intente de varias formas :/ 


Título: Re: Duda en consulta
Publicado por: fede_cp en 15 Diciembre 2009, 17:51 pm
uhh, pense que era una sola tabla  :xD, jajaja

yo lo haria con una sola tabla (menos dolor de cabeza  :P).


saludos y disculpen mi error

PD:300 al fin! jajaja


Título: Re: Duda en consulta
Publicado por: ^Tifa^ en 15 Diciembre 2009, 17:56 pm
Yo haria una vista y salgo del asunto de siempre tener que obtener el valor en una variable y luego llamarlo... sobretodo porque las variables son temporales, seguido te desconectas del motor el dato volatil se flushea.

Y estar constantemente haciendo 2 consultas (una para asignar valor a la variable otra para llamar ese valor) no lo aplicaria yo pero... para gustos.

Si quieres puedes hacer una vista que se mantendra siempre actualizada a los datos de ambas tablas, ejemplo:

Código
  1.  
  2. mysql> SELECT usuarios.nombres, COUNT(posts.pid) veces FROM usuarios INNER JOIN posts WHERE usuarios.id = posts.id GROUP BY(usuarios.id);
  3. +---------+-------+
  4. | nombres | veces |
  5. +---------+-------+
  6. | pepe    |     6 |
  7. | Juan    |     4 |
  8. | Maria   |     6 |
  9. | Luis    |     2 |
  10. +---------+-------+
  11. 4 ROWS IN SET (0.00 sec)
  12.  
  13.  


Código
  1.  
  2. mysql> CREATE VIEW vista AS SELECT usuarios.nombres AS nombre, COUNT(posts.pid) AS veces FROM posts INNER JOIN usuarios WHERE usuarios.id = posts.id GROUP BY usuarios.id;
  3.  
  4. mysql> SELECT nombre, veces FROM vista WHERE veces = ( SELECT MAX(veces) FROM vista);
  5. +--------+-------+
  6. | nombre | veces |
  7. +--------+-------+
  8. | pepe   |     6 |
  9. | Maria  |     6 |
  10. +--------+-------+
  11. 2 ROWS IN SET (0.01 sec)
  12.  
  13.  

PD: El ejemplo anterior es basado en mis tablas ejemplos puestas anteriormente.


Título: Re: Duda en consulta
Publicado por: sempus en 15 Diciembre 2009, 18:17 pm
que curioso, a mi tambien se me ocurrio lo de la vista xD ,pero la deseche porque no estara siempre actualizada por lo menos, yo para actualizar uso REQUERY( ), entonces, dije, bah, en lugar de hacer 3 consulta 1) para actualizar la vista , 2) la que necesito y 3) la subconsulta, decide hacerlo de la forma que lo postee xD, aunque como tu dices para los gustos los colores, el caso es que esta resuelto  :)


Título: Re: Duda en consulta
Publicado por: ^Tifa^ en 15 Diciembre 2009, 18:26 pm
Citar
que curioso, a mi tambien se me ocurrio lo de la vista xD ,pero la deseche porque no estara siempre actualizada

Recuerda corazon que la vista sencillamente es una tabla virtual no existe fisicamente, sus datos siempre reflejan lo que las tablas padres que lo componen posee. Por ende si se elimina, actualiza, inserta algun dato en un campo de la tabla padre, dicho campo tendra automaticamente la misma modificacion en la vista  ;)

Creo que con la vista creada ya es mas facil porke basaria 1 sola consulta siempre sobre la vista y asi obtendria lo que busca de manera siempre actualizada.


Título: Re: Duda en consulta
Publicado por: дٳŦ٭ en 15 Diciembre 2009, 19:10 pm
 :xD andaba medio perdido pero muchas gracias Tifa por tu explicación  :)


Título: Re: Duda en consulta
Publicado por: ^Tifa^ en 16 Diciembre 2009, 03:47 am
No pasa nada дٳ para eso estamos todos aqui  :D

Hay variadas maneras de el chico hacer lo que solicita, lo de la Vista es una, como tambien podria agregar 1 campo extra en la tabla usuarios que se llame por ejemplo 'veces' y que cada vez que X usuario haga un nuevo mensaje pues dicho campo 'veces' vaya creciendo de 1 en 1  ;)
Asi podria ahorrarse el costoso analisis del JOIN y consultar en base a una sola tabla 'Usuarios'.

Deben haber mas maneras de hacer lo que el pide, pero ya que estamos ofertando sugerencias.