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

[SOLUCIONADO] SQL AVG con condición

Estas en el tema de SQL AVG con condición en el foro de Mysql en Foros del Web. Hola amig@s, mi problema es el siguiente, estoy haciendo una página que controla los tiempos en los que se hace el cubo de Rubik, y ...
  #1 (permalink)  
Antiguo 01/08/2017, 19:21
Avatar de Thejuanjo  
Fecha de Ingreso: mayo-2014
Mensajes: 28
Antigüedad: 9 años, 11 meses
Puntos: 2
Pregunta SQL AVG con condición

Hola amig@s,
mi problema es el siguiente, estoy haciendo una página que controla los tiempos en los que se hace el cubo de Rubik, y quiero hacer que se ordenen los tiempos por media, es decir por 'media' <- [AVG(`time`) as `media`].

El problema es que una media de los tiempos en Rubik se elimina el mejor y el peor tiempo y se hace la media.
Intenté poner lo siguiente

Código PHP:
$rank mysqli_query($mysqli,"SELECT *, min(`time`) as `timer`, max(`time`) as `Mtimer`, avg(CASE WHEN `time` > `timer` AND `time` < `Mtimer` THEN `time` ELSE 0 END) as `media`, max(`status`) as `ast` FROM `times` WHERE `status` < 2 GROUP by `name` ORDER by `media` ASC LIMIT 28"); 
Pero por lo que se ve tiene que ser directamente con las columnas de la tabla.
He intentado con ejemplos de la pagina stackoverflow que hay gente con problemas parecidos, pero no me funciona.

¿Alguien puede ayudarme?

Gracias de antemano, ¡un saludo!
  #2 (permalink)  
Antiguo 01/08/2017, 20:47
Avatar de Thejuanjo  
Fecha de Ingreso: mayo-2014
Mensajes: 28
Antigüedad: 9 años, 11 meses
Puntos: 2
Respuesta: SQL AVG con condición

He encontrado una solución que es esta (sólo el principio del código, lo demás es irrelevante):

Cita:
$rank = mysqli_query($mysqli,"SELECT *,
max(`status`) as ast,
avg(`time`) as `media`
FROM $server_db.times WHERE `time` < (SELECT max(`time`) FROM $server_db.`times` WHERE `status` != 2) && `time` > (SELECT min(`time`) FROM $server_db.`times` WHERE `status` != 2)
&& `status` != 2 GROUP by `name` ORDER by `media` ASC LIMIT 28");
while(mysqli_num_rows($rank)>0 && $rankw = mysqli_fetch_array($rank)){
$mTimer = mysqli_query($mysqli,"SELECT * FROM $server_db.`times` WHERE `name` = '".$rankw['name']."' order by `time` ASC LIMIT 1");
while(mysqli_num_rows($mTimer) >0 && $mintimw = mysqli_fetch_array($mTimer)){$mintim = $mintimw['time'].'-';}
Pero me gustaría saber si existe la manera directa de hacerlo, ya que mi manera puede que tarde más o tenga mas carga para el servidor... la cosa es que esta información se actualiza al insertar los tiempos automáticamente mediante ajax así que no quiero colapsar el server con este tipo de código.

Y sí, uso de nuevo una función $mTimer para ver el mejor tiempo (el más bajo). Ya que lo que hace este código es imprimirme en una div la clasificación de los primeros 28 participantes ordenados por la media (average) y también muestra el mejor tiempo (single) de cada uno.
  #3 (permalink)  
Antiguo 02/08/2017, 11:50
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: SQL AVG con condición

Esto no tiene que ver con PHP, sino con base de datos; muevo tu tema a MySQL donde podrán orientarte mejor.
__________________
- León, Guanajuato
- GV-Foto
  #4 (permalink)  
Antiguo 02/08/2017, 12:19
Avatar de Thejuanjo  
Fecha de Ingreso: mayo-2014
Mensajes: 28
Antigüedad: 9 años, 11 meses
Puntos: 2
Respuesta: SQL AVG con condición

El código usado no me funciona bien, pues si un nuevo usuario inserta tiempos, se hace la media truncada sólo de 1 no de todos.
  #5 (permalink)  
Antiguo 20/08/2017, 14:57
Avatar de Thejuanjo  
Fecha de Ingreso: mayo-2014
Mensajes: 28
Antigüedad: 9 años, 11 meses
Puntos: 2
Respuesta: SQL AVG con condición

He solucionado lo que quería, pues he tenido que tirar de otra forma de hacerlo, así que lo doy por solucionado.

PD: veo que hay cerca de 1.000 visitas y no hay respuesta, no hay solución -.-"

Etiquetas: avg, case, php, sql
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 21:22.