![]() |
Consulta que no me sale ordenada Hola, saludo a todos/as... Tengo una table en Access donde tengo tres campos: - Nombres de jugadores de futbol. - Las puntuaciones totales para cada uno de ellos (1000 puntos, 858 puntos, etc…) y que es la suma de todos los puntos que le han dado los usuarios. - El número de votos dados a cada jugador (número de personas que han votado a fulanito o a menganito). Bien, ahora imaginad que quiero presentar los jugadores en orden descendente en función de su valoración (el jugador mejor valorado arriba, y el peor valorado al final). Como no tengo un campo en la base de datos que informe de cual es el mejor valorado, tenemos que hacer una operación dividiendo el campo valoracion_total (que es el total de puntos recibidos por cada jugador), entre veces_valorado (veces que se ha votado por ese jugador). Problema que surge: Hay jugadores que no han recibido ninguna valoración, por lo que cero dividido entre cero, da error. Es decir, una consulta de este tipo, no funciona: Código: SELECT * FROM jugadores ORDER BY (valoracion_total/veces_valorado) DESC[color=green] Código: SELECT * FROM jugadores WHERE veces_valorado>0 ORDER BY (valoracion_total/veces_valorado) DESC, veces_valorado DESC, jugador ASCCódigo: SELECT * FROM jugadores WHERE veces_valorado=0 ORDER BY jugador ASCLa segunda consulta mostraría los jugadores que no han sido valoradas, por el su nombre, de forma ascendente. Problemaaaaaaaaaaaa: Si uno ambas sentencias, no me mantiene el orden lógico por el que me debería mostrar los jugadores. Es decir, si utilizo la siguiente consulta, me muestra los jugadores por su nombre de forma ascendente, con independencia de la puntuación recibida por cada jugador: Código: (SELECT * FROM jugadores WHERE veces_valorado>0 ORDER BY (valoracion_total/veces_valorado) DESC, veces_valorado DESC, jugador ASC) UNION ALL (SELECT * FROM jugadores WHERE veces_valorado=0 ORDER BY jugador ASC)Gracias miles. |
Re: Consulta que no me sale ordenada Código: Código: Quim |
Re: Consulta que no me sale ordenada Sí, así funciona perfectamente, pero ¿por qué no funciona mi "sistema"?. Muchas gracias por tu respuesta. PD: Aplicaré tu condicional, pero no entiendo porqué cohone no funciona lo mío. |
Re: Consulta que no me sale ordenada A ver si te vale con esto: SELECT * FROM jugadores ORDER BY IIf(nz([veces_valorado],0)=0,0,[Valoracion_Total]/[veces_valorado]) DESC; Un saludo |
Re: Consulta que no me sale ordenada Supongo que se hace un lio de indices, sql es declarativo a diferencia de los otros lenguajes que podriamos decir que son imperativos... Es decir en Sql tu dices lo que quieres y el se busca la vida para obtenerlo de la forma mas optima segun el motor de bbdd que lo este ejecutando. En los otros lenguajes tu programas lo que hay que hacer para obtener lo que quieres. Si no usaras Access, es decir si usaras un motor de verdad de bbdd tendrias el comando explain plan que muestra como se ejecutara la sentencia, seguramente veriamos que esta ejecutando primero los select y luego aplica los indices con lo que al no ser iguales se hace un lio... pero bueno esto ultimo es una especulación. nz([veces_valorado],0) lo necesitaras si hay nulos en veces_valorado pero si su valor por defecto es cero no hace falta. Gràcias Taribo007 por la mejora. Quim |
Re: Consulta que no me sale ordenada Gracias Taribo007, si a tu consulta le añado un "veces_valorado DESC" entonces sí. Ahora Pero sigo con mi duda: ¿Por qué no ordena correctamente los datos devueltos, mi consulta con el UNION ALL?. PD: Por cierto, desconocía el uso de la función nz. |
Re: Consulta que no me sale ordenada Gracias por tu respuesta Quim. ¿Te parece incorrecta la construcción de mi sentencia con el UNION ALL (no me da error, sino que me ordena los datos como le sale del mismísimo)?. ¿Ves algún error por algún lado (yo soy incapaz de verlo)?. PD: veces_valorado es cero por defecto (gracias por la aclaración sobre la función nz). |
Re: Consulta que no me sale ordenada El problema creo que no esta en la sentencia sino en como la ejecuta el motor como te he dicho. Sabes que en Sql se puede pedir lo mismo de formas distintas, pues he visto dos sentencias correctas el resultado de las quales deberia ser el mismo y una se queda colgada y la otra se ejecuta en nanosegundos...:borracho: No tengo ningun ejemplo de union all con sentencias order para cada select, en todo caso el error tendria que venir por aqui. Una forma de ver si estan bien es ejecutarlas por separado, si funcionan y como tendran los mimos campos en principio deberian poderse unir. Siempre y cuando el proceso de ejecucion sea el seguiente: Select Order Select Order Union Pero si por lo que sea, las limitaciones del motor por ejemplo el proceso es Select Select Union Order Order esto funcionaria si el Order fuera igual para los dos selects pero al no serlo vete a saber que hace... Otra es mirar que dice la teoria sobre el UNION ALL y los ORDER BY pero que yo recuerde solo dice que las dos querys a unir deben tener los mismos campos.... Quim |
Re: Consulta que no me sale ordenada Gracias por la respuesta. Por cierto pensaba que evaluando ese condicional (si el jugador no tiene valoración => 0), iba a hacer que la consulta fuera algo lenta, pero con asombro veo que es rapidísima. PD1: Gracias por la última aclaración. PD2: No llevo suelto :borracho:, pero sí que os doy karma a los 2, por vuestra ayuda. |
Re: Consulta que no me sale ordenada De la ayuda de MySql. Quim Cita:
|
Re: Consulta que no me sale ordenada Jajajajajaa, más claro el agua. Muchas gracias :arriba: |
Re: Consulta que no me sale ordenada Cita:
Un saludo |
| La zona horaria es GMT -6. Ahora son las 10:44. |
Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.