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

¿Como hacer esta consulta?

Estas en el tema de ¿Como hacer esta consulta? en el foro de Mysql en Foros del Web. Hola, Estoy intentando hacer una consulta pero se me está resistiendo y no doy con lo que busco: La tabla "Tarifas" es la siguiente: id ...
  #1 (permalink)  
Antiguo 23/09/2010, 08:52
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 20 años, 10 meses
Puntos: 3
¿Como hacer esta consulta?

Hola,

Estoy intentando hacer una consulta pero se me está resistiendo y no doy con lo que busco:

La tabla "Tarifas" es la siguiente:

id | precio1 | precio2 | precio3
1 | 100 | 90 | 0
2 | 0 | 50 | 75
3 | 0 | 0 | 10

La cosa es que estoy intentado obtener el valor de "id" de la fila que tenga el menor precio de los 3 campos de precio (sin contar el 0, es decir, todos los mayores de 0), por ejemplo en este caso sería la id=3 ya que el menor es el campo "precio3" de la tercera fila.

La consulta que estoy intentando es la siguiente:
Código HTML:
SELECT MIN(LEAST(if(tarifas.precio1>0, tarifas.id, 100000), if(tarifas.precio2>0, tarifas.id, 100000), if(tarifas.precio3>0, tarifas.id, 100000))) AS idmenor FROM tarifas
Me devuelve el id del primero y sin embargo si hago lo siguiente:
Código HTML:
SELECT MIN(LEAST(if(tarifas.precio1>0, tarifas.precio1, 100000), if(tarifas.precio2>0, tarifas.precio2, 100000), if(tarifas.precio3>0, tarifas.precio3, 100000))) AS preciomenor FROM tarifas
Me devuelve correctamente el valor del menor.
¿A que puede deberse?

Muchas Gracias
  #2 (permalink)  
Antiguo 23/09/2010, 09:23
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 7 meses
Puntos: 150
Respuesta: ¿Como hacer esta consulta?

jeje, me ha costao un rato sacar una forma, no se si sera la más idonea, te la explico por partes

Primero esto:

(SELECT id,precio1 from tarifas where precio1>0 order by precio1 ASC LIMIT 1)

Con eso obtendriamos el menor de precio1 que sea mayor que 0....

1 - 100

Pero si usamos el UNION para ir agregando registros......

(SELECT id,precio1 from tarifas where precio1>0 order by precio1 ASC LIMIT 1) UNION
(SELECT id,precio2 as precio1 from tarifas where precio2>0 order by precio2 ASC LIMIT 1) UNION
(SELECT id,precio3 as precio1 from tarifas where precio2>0 order by precio3 ASC LIMIT 1)


Obtendriamos:

1 - 100
2 - 50
3 - 10


Justo las 3 filas porque es como tienes el ejemplo, no importa, hemos obtenido 3 registros independientes con su SELECT cada uno, ya solo falta el toque final:

(SELECT id,precio1 from tarifas where precio1>0 order by precio1 ASC LIMIT 1) UNION
(SELECT id,precio2 as precio1 from tarifas where precio2>0 order by precio2 ASC LIMIT 1) UNION
(SELECT id,precio3 as precio1 from tarifas where precio3>0 order by precio3 ASC LIMIT 1)
ORDER BY precio1 ASC LIMIT 1


Esos 3 minimos ahora los volvemos a ordenar para quedarnos con el primer registro. Cualquier duda preguntame, aunque debe ser la 4º o 5ª vez que uso los UNION, no soy muy experto jeje.
  #3 (permalink)  
Antiguo 23/09/2010, 12:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: ¿Como hacer esta consulta?

Si quieres sacar el id, además del mínimo valor:
select id, least(if(precio1=0,'a', precio1), if(precio2=0, 'a', precio2), if(precio3=0, 'a',precio3)) preciomasbajo FROM tarifas where least(if(precio1=0,'a', precio1), if(precio2=0, 'a', precio2), if(precio3=0, 'a',precio3)) =(SELECT MIN(Least(if(precio1=0,'a', precio1), if(precio2=0, 'a', precio2), if(precio3=0, 'a',precio3))) FROM `tarifas`)
  #4 (permalink)  
Antiguo 28/09/2010, 05:49
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 20 años, 10 meses
Puntos: 3
Respuesta: ¿Como hacer esta consulta?

Perfecto!! Ha funcionado a las 1000 maravillas!!

Muchas Gracias

Etiquetas: Ninguno
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 14:48.