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

Como puedo hacer éste tipo de Consulta?

Estas en el tema de Como puedo hacer éste tipo de Consulta? en el foro de Mysql en Foros del Web. Ante todo Buenas Noches.. ando con un problema.. tengo que hacer una consulta y no se me ocurre como hacerla.. les cuento: en la tabla ...
  #1 (permalink)  
Antiguo 03/06/2009, 20:31
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Exclamación Como puedo hacer éste tipo de Consulta?

Ante todo Buenas Noches..
ando con un problema.. tengo que hacer una consulta y no se me ocurre como hacerla.. les cuento:

en la tabla 'general'

ID Num
1 20
2 30
3 50


ahora bien, yo quiero una consulta que se base en el acercamiento a un numero $X

ejemplo:
si $X = 15 me tendria que ordenar la consulta: 20,30,50
si $X = 26 me tendria que ordenar la consulta: 30,20,50
si $X = 48 me tendria que ordenar la consulta: 50,30,20


nose si está claro.. no se como mejor explicarme...

un Saludo y muchas gracias de antemano
__________________
Recuerda usar el highlight para mostrar código
mauricioblint.com
  #2 (permalink)  
Antiguo 03/06/2009, 20:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Como puedo hacer éste tipo de Consulta?

Tu problema excede los límites de la lógica de consultas en SQL y en realidad tiene más relación con la programación de aplicaciones.
Si bien se podría implementar en un stored procedure, al final estarías haciendo una rutina excesivamente compleja e inefiicente, cuando podrías lograr lo mismo y mejor en PHP, VB, VB.Net, C#, Delphy o C++.
No creo que sea una buena idea intentarlo desde la base de datos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 04/06/2009, 08:02
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Respuesta: Como puedo hacer éste tipo de Consulta?

ajá.. gracias por tu respuesta.. voy a seguir pensando.. alguna forma deberia haber creo pero me puede..

Saludos!
__________________
Recuerda usar el highlight para mostrar código
mauricioblint.com
  #4 (permalink)  
Antiguo 04/06/2009, 09:22
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Como puedo hacer éste tipo de Consulta?

Una propuesta es con una consulta UNION ALL, pero que requiere usar limit para mantener las dos ordenaciones:
Código sql:
Ver original
  1. (SELECT * FROM tabla WHERE num <= CEIL(variableX/10)*10 ORDER BY num DESC LIMIT 10000)
  2. UNION ALL
  3. (SELECT * FROM tabla WHERE num > CEIL(variableX/10)*10 ORDER BY num ASC LIMIT 10000)


Buscas los num menores o iguales a la conversión a entero superior de una división por 10 y ordenas descendente; luego eso lo unes con la búsqueda de num mayor que eso mismo, pero ordenando ascendente. Tienes que usar un LIMIT. No sé cuántos num distintos tienes, pero con una cifra como esta que te he puesto de 10000 tendrás suficiente. Tal vez haya otro modo de resolver eso, pero esto, creo, funciona como quieres, y se trata de una consulta.
  #5 (permalink)  
Antiguo 06/06/2009, 20:28
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Respuesta: Como puedo hacer éste tipo de Consulta?

Muchas Gracias jurena! ya lo daba por imposible.. ahora mismo probaré si funciona y comento..

Gracias!
__________________
Recuerda usar el highlight para mostrar código
mauricioblint.com
  #6 (permalink)  
Antiguo 07/06/2009, 18:19
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Respuesta: Como puedo hacer éste tipo de Consulta?

Disculpá que te pregunte de nuevo.. nose como usar esa consulta, no la conocia ¬¬
haber si está bien asi, porque me dar error..

Código PHP:
$sql mysql_query("
SELECT * FROM general WHERE x <= ceil($xu/10)*10  ORDER BY num DESC LIMIT 10000
UNION ALL
SELECT * FROM general WHERE x >= ceil($xu/10)*10 ORDER BY num DESC LIMIT 10000"
); 
Muchas Gracias!
__________________
Recuerda usar el highlight para mostrar código
mauricioblint.com
  #7 (permalink)  
Antiguo 07/06/2009, 20:43
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Como puedo hacer éste tipo de Consulta?

McBlink

Como primera medida, es bueno probar la consulta desde la consola de mysql o desde el gestor gráfico que manejes. De esta forma, se puede determinar si es problema de la consulta o de php.

Me imagino que jurena a probado esta consulta antes de postearla... (Cuando no lo hace, normalmente lo comenta) y veo que encierra cada consulta entre parentesis. Tu no lo tienes así.

Otra cosa que debes corregir, (aunque no es un error sintactico), una de las consultas debe ser <= y la otra > o < y >= ya que uno, contiene el otro.

Prueba si es eso y nos cuentas.

Un saludo a todos.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 08/06/2009, 00:33
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Como puedo hacer éste tipo de Consulta?

Esta sería la consulta, como te dice huesos, tal cual, con todos estos paréntesis que sirven para diferenciar los elementos de la UNION.
Código sql:
Ver original
  1. (SELECT * FROM general WHERE num <= CEIL($xu/10)*10  ORDER BY num DESC LIMIT 10000)
  2. UNION ALL
  3. (SELECT * FROM general WHERE num > CEIL($xu/10)*10 ORDER BY num DESC LIMIT 10000)

McBlink, sólo he dejado de php la variable. No olvides que en este foro no podemos escribir código que no sea SQL, MySQL o cuestiones sobre bases de datos; estoy seguro de que podrás adaptarlo, y si tienes dificultades, pide ayuda luego en el foro PHP.
Pero lo primero es lo primero, como te dice nuestro amigo huesos52, debes probar en consola o con el gestor gráfico que uses esta consulta, poniendo en lugar de la variable $xu el número que sepas que te dará resultados. Yo la probé y salía lo que creo pedías. Observa que he cambiado x por num, porque según dijiste el campo contra el que buscas se llama num. Así mismo deberías saber que cardinalidad tiene ese campo num, es decir, cuantos números distintos tienes, fundamentalmente para rebajar el número del LIMIT al adecuado.
La otra corrección que te ha hecho huesos52 también es correcta. Recuerda que quieres que el el número divisible por 10 que debe aparecer primero es el superior al número que introduces, a $xu, pero en la consulta, al usar ceil y multiplicar por 10, ya te sale ese número, por lo que si quieres que aparezca en la primera selección debes usar ese <= en el primer elemento del UNION ALL y > en el segundo.
Saludos a ambos.
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 22:36.