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.
MAX()
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().
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.
cita un ejemplo
saludos
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?
Un ejemplo hipotetico sería
<?php
$con="SELECT MAX(id_post) FROM usuarios";
$row=mysql_query($con, $conexion);
$rrs=mysql_fetch_array($row);
$con2="SELECT user from usuario WHERE id_post='".$rss["0"]."'";
$row2=mysql_query($con2, $conexion);
$rss=mysql_fetch_array(row2);
echo $rss[0];
?>
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
Hola.
No entiendo muy bien el código PHP.
¿Podrías ponerla en lenguaje SQL "puro"?
Gracias.
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
Imagina este escenario basandome en lo que tu expones (Sobre tus 2 tablas usuarios y posts):
mysql> select * from usuarios;
+----+--------+
| id | nombre |
+----+--------+
| 1 | pepe |
| 2 | Mario |
| 3 | Maria |
| 4 | Juan |
| 5 | Jose |
+----+--------+
5 rows in set (0.00 sec)
mysql> select * from post;
+------+------+--------------------------+
| id | pid | mensaje |
+------+------+--------------------------+
| 1 | 1 | Me gusta la lluvia |
| 1 | 1 | La vida es bella |
| 1 | 1 | Que pais visitar |
| 2 | 2 | Mi color favorito |
| 1 | 1 | Tu fruta favorita |
| 3 | 3 | Me gustan los viernes |
| 3 | 3 | Dia de mi cumple |
| 1 | 1 | Que computadora comprar? |
| 1 | 1 | Mi laptop rosa |
| 4 | 4 | La manzana roja |
| 4 | 4 | Aprendiendo lotus |
| 4 | 4 | Viva Oracle |
| 4 | 4 | Tu comida preferida |
+------+------+--------------------------+
13 rows in set (0.00 sec)
Ahora quieres saber cuantos mensajes existen en la tabla post que hayan realizado cada usuario de la tabla usuarios.
mysql> select usuarios.nombre, count(post.pid) from post inner join usu
arios where usuarios.id = post.id group by usuarios.id;
+--------+-----------------+
| nombre | count(post.pid) |
+--------+-----------------+
| pepe | 6 |
| Mario | 1 |
| Maria | 2 |
| Juan | 4 |
+--------+-----------------+
4 rows in set (0.00 sec)
Ahora si tu proposito unicamente es saber que usuario es el que ha realizado la mayoria de posts:
mysql> select usuarios.nombre, count(post.pid) from post inner join usuarios whe
re usuarios.id = post.id group by usuarios.id limit 1;
+--------+-----------------+
| nombre | count(post.pid) |
+--------+-----------------+
| pepe | 6 |
+--------+-----------------+
1 row in set (0.00 sec)
yo lo haria de esta forma, los campos se llaman distinto pero la idea se entiende
SELECT count(codigo) veces, codigo FROM saldos GROUP BY codigo ORDER BY veces DESC
variable = query.veces
SELECT * from query WHERE veces = variable
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 :/
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
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:
mysql> select usuarios.nombres, count(posts.pid) veces from usuarios inner join posts where usuarios.id = posts.id group by(usuarios.id);
+---------+-------+
| nombres | veces |
+---------+-------+
| pepe | 6 |
| Juan | 4 |
| Maria | 6 |
| Luis | 2 |
+---------+-------+
4 rows in set (0.00 sec)
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;
mysql> select nombre, veces from vista where veces = ( select max(veces) from vista);
+--------+-------+
| nombre | veces |
+--------+-------+
| pepe | 6 |
| Maria | 6 |
+--------+-------+
2 rows in set (0.01 sec)
PD: El ejemplo anterior es basado en mis tablas ejemplos puestas anteriormente.
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 :)
Citarque 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.
:xD andaba medio perdido pero muchas gracias Tifa por tu explicación :)
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.