UTNianos

Versión completa: Problema MySQL
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Estoy haciendo un sitio para una red inmobiliaria. Hay una tabla con el listado de propiedades y hay que realizar diferentes busquedas sobre el mismo.

El problema es cuando tengo que ordenar los resultados por precio, porque algunos precios estan en pesos y otros en dolares. Entonces tendria que multiplicar por $valor_dolar los precios en dolares para generar el ordenamiento.

La tabla simplificada seria algo asi:
ID_Propiedad: int
Moneda: char ("d" = dolar, "p" = pesos)
Precio: int

Es decir, al momento de hacer la consulta tengo que multiplicar "Precio" por $valor_dolar solo si Moneda = "d" y que el ordenamiento se realice segun esos nuevos valores.

Se puede hacer esto directamente en la consulta y que ya me de el resultado ordenado o tengo que cargar toda la info en un array y ordenarla recien ahi desde el codigo?

Gracias y saludos!
¿en qué lenguaje estás programando? si usás objetos debería ser todo más simple, es sencillo lo que querés hacer.

tendrías que armar un objeto "aviso" que tenga el precio y la moneda. ese objeto sabe responder los mensajes "precio" y "precio en pesos". ese método se encarga de la lógica, y se fija si tiene moneda "p" devuelve lo mismo que "precio" y sino devuelve precio por la cotización. entonces al momento de ordenar lo hacés por "precio en pesos".
esto a su vez te permite tener otro método que sea "precio en dólares" y que haga lo mismo, pero al revés. por si algún extranjero está buscando depto y quiere ver los precios en una moneda que le resulte familiar para hacerse una idea.

también tenés que tener en cuenta que la cotización va cambiando día a día, así que deberías mantener un histórico, o al menos la cotización del día. se supone que ese valor es estimado, y que no varía durante todo el día, así que no hace falta que se consulte constantemente a la base, sino que lo metés como una variable global (o en el session, si usás php, creo). ¿se entiende?

en fin, si me copo escribiendo no termino más. laburo desarrollando sistemas financieros, así que algo de ésto creo que sé, jaja.

pero no tenés que resolver nada por base. que la base sirva nomás para guardar datos. todo lo demás hacelo en el modelo.
Gracias!
Estoy haciendolo en php, pero no estoy usando objetos.
Mi idea era hacer la consulta espeficando que queria que lo ordene por "precio ASC" pero si "moneda" = "d" entonces precio*4
(El literal 4 es el valor de una variable $valor_dolar, que obvio se va actualizando con la cotizacion).
Es decir, que el motor de base de datos se encargue de ordenarlo. Asi hice siempre con cualquier laburo, el tema es que esta vez necesito que opere antes si se cumple una condicion.

Tenes idea si se puede hacer eso?
Gracias de nuevo, saludos!
Bueno, dando mil vueltas y leyendo cosas que no entendi pude hacer algo.
Lo posteo por si alguna vez alguien tiene un problema similar:

SELECT if(Moneda="d",precio*4, precio) as precio FROM propiedades ORDER BY precio ASC

Lo que dice es que devuelva los valores de la columna precio (obviamente yo le voy a pedir que me devuelva todas las columnas, aca es solo para simplificar) si Moneda="d" entonces asigna a "precio" (lo dice con "as precio") el valor precio*4, sino el valor "precio".

Gracias igual LeaTex, Saludos!
justo te iba a decir que uses CASE.
(29-03-2011 22:37)brunodiaz escribió: [ -> ]justo te iba a decir que uses CASE.

lo mismo =(
una vez que puedo responder una duda de desarrollo, me iba a sentir groso (?)
está bien, ahora digo, ¿por qué no hacés eso en php?
sin usar objetos, en estructurado también podés hacerlo. a lo mejor se te complica ordenar el array, pero podés. de todos modos ese select lo estás armando dinámicamente para meterle el valor de la variable valor_dolar.
así si mañana querés meter avisos en euros, yenes y lo que sea, no tenés que armar un select monstruoso con un case o 200 if anidados. ¿se entiende?

pero bueno, esa sería una alternativa viable, obvio.
SELECT id_propiedad,
(CASE WHEN moneda = 'p' THEN precio ELSE precio * 4 END) AS valor_pesos
FROM tabla;

(quizás puede haber algun pifie de sintaxis, pero la idea es esa).

El tema es que el valor del dolar puede variar. Lo que se puede hacer es tener una tabla de cotizaciones con el valor histórico del dólar en cada fecha, y que siempre tomes el último (o el correspondiente a la fecha de la operación), por eso ahí en vez de poner el "4" simbólico que puse arriba, tendría que ir el campo de esta tabla, y la tabla tiene que estar en un INNER JOIN en el FROM.

Si usas PHP, podés traerte los valores en bruto en la moneda original y convertirlo luego, tomando el valor actual del dólar de algún servicio web, que supongo que debe haber para eso, pero desconozco.
creo que no entendiste bien el problema pablo =P
No sé, para mí devuelve lo que él pide =P.

Y sí, me faltó el order by.
ahhhh, viteh, viteh
perdon, para no destruir tanto el topic, en php puede cambiar el 4 por una varialbe previamente cargada con el valor del dolar al armar el query.
Yo estoy intentando crear algo parecido, tambien con PHP y MySQL, a medida que voy aprendiendo (o sea, cuando esté "terminado" va a ser un desastre terrible =D)

Las casas que tienen el precio en pesos en general son las mas baratas...los alquileres tambien se suelen poner en pesos, todo lo demas en dolares. De ultima, la "solución" pajera sería ordenar y listar primero todas las que estan en dolares y despues en pesos...

PD: Lo que hice (seguramente mandandome alguna cagada) para guardar la informacion de cada propiedad son campos con un valor numerico para el precio de venta y alquiler por separado, y otro con un enum para la moneda, tambien para venta y alquiler por separado. Mas que nada por si llega haber un local con un departamento arriba que se vende y se alquila o alguna mezcla así rara, y así no haría falta crear entradas repetidas para una misma cosa.
Cita:está bien, ahora digo, ¿por qué no hacés eso en php?
sin usar objetos, en estructurado también podés hacerlo. a lo mejor se te complica ordenar el array, pero podés. de todos modos ese select lo estás armando dinámicamente para meterle el valor de la variable valor_dolar.
así si mañana querés meter avisos en euros, yenes y lo que sea, no tenés que armar un select monstruoso con un case o 200 if anidados. ¿se entiende?

Si, hacerlo en el codigo era una alternativa si no podia solucionarlo en la consulta. Pasa que ya tenia todo programado, inicialmente ordenaba todo indistintamente de la moneda hasta que me di cuenta que me habia olvidado eso (muy boludo!) y queria modificarlo de la forma mas simple, sin ponerme a tocar codigo. Supongo que la proxima vez que tenga un problema asi lo hare con un array!

Cita:El tema es que el valor del dolar puede variar. Lo que se puede hacer es tener una tabla de cotizaciones con el valor histórico del dólar en cada fecha, y que siempre tomes el último (o el correspondiente a la fecha de la operación), por eso ahí en vez de poner el "4" simbólico que puse arriba, tendría que ir el campo de esta tabla, y la tabla tiene que estar en un INNER JOIN en el FROM.

En el "panel de control" del sitio esta la opcion de modificar el dolar. En la consulta la incluyo como $valor_dolar y listo.
De todas formas no tiene que ser algo tan exacto, es para tomar de referencia. Como todos los precios se muestran en su moneda original, el valor dolar solamente se usa para ordenar, para saber si 50mil pesos es mas o menos que 50mil dolares, nada mas. Si el dolar no tiene ninguna variacion grande entonces no es necesario actualizarlo a la ultima cotizacion.
URLs de referencia