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

Problema al buscar por precio

Estas en el tema de Problema al buscar por precio en el foro de Mysql en Foros del Web. Hola tengo una tabla con precios separados por un punto, 120.000, estoy buscando mayor que y menor que tal como especifico abajo. Si busco menores ...
  #1 (permalink)  
Antiguo 03/07/2015, 15:38
 
Fecha de Ingreso: septiembre-2011
Mensajes: 176
Antigüedad: 12 años, 7 meses
Puntos: 0
Problema al buscar por precio

Hola tengo una tabla con precios separados por un punto, 120.000, estoy buscando mayor que y menor que tal como especifico abajo.

Si busco menores de 80.000 también me aparecen los menores de 80.000 y también los que sean mayores de 1.000.000 millón. Hay es donde tengo el problema con los millones que no deberían aparecer.
Código SQL:
Ver original
  1. SELECT *
  2. FROM ventas
  3. WHERE precio < 80.000
  4. ORDER BY precio ASC
  5. LIMIT 0 , 30

SALIDA

Código HTML:
Ver original
  1. Textos completos    id  precio Ascendente
  2.     Editar Editar   Copiar Copiar   Borrar Borrar   1190    1.000.000
  3.     Editar Editar   Copiar Copiar   Borrar Borrar   827     1.077.600
  4.     Editar Editar   Copiar Copiar   Borrar Borrar   2050    1.100.000
  5.     Editar Editar   Copiar Copiar   Borrar Borrar   1122    1.150.000
  6.     Editar Editar   Copiar Copiar   Borrar Borrar   967     1.150.000
  7.     Editar Editar   Copiar Copiar   Borrar Borrar   1234    1.380.000
  8.     Editar Editar   Copiar Copiar   Borrar Borrar   1005    1.595.900
  9.     Editar Editar   Copiar Copiar   Borrar Borrar   1276    1.678,00
  10.     Editar Editar   Copiar Copiar   Borrar Borrar   1066    1.690.000
  11.     Editar Editar   Copiar Copiar   Borrar Borrar   880     1.953.700
  12.     Editar Editar   Copiar Copiar   Borrar Borrar   954     2.800.000
  13.     Editar Editar   Copiar Copiar   Borrar Borrar   2143    22.000
  14.     Editar Editar   Copiar Copiar   Borrar Borrar   2019    24.900
  15.     Editar Editar   Copiar Copiar   Borrar Borrar   1975    25.000
  16.     Editar Editar   Copiar Copiar   Borrar Borrar   1286    27.000
  17.     Editar Editar   Copiar Copiar   Borrar Borrar   1538    28.800
  18.     Editar Editar   Copiar Copiar   Borrar Borrar   1335    29.000
  19.     Editar Editar   Copiar Copiar   Borrar Borrar   2151    30.000
  20.     Editar Editar   Copiar Copiar   Borrar Borrar   591     30.800
  21.     Editar Editar   Copiar Copiar   Borrar Borrar   253     65.000
  22.     Editar Editar   Copiar Copiar   Borrar Borrar   2084    70.000
  23.     Editar Editar   Copiar Copiar   Borrar Borrar   1962    79.000





En cambio si busco mayores de 80.000 me salen los mayores de ochenta mil pero no los millones que aquí si deberian salir.
Código SQL:
Ver original
  1. SELECT *
  2. FROM ventas
  3. WHERE precio > 80.000
  4. ORDER BY precio ASC
  5. LIMIT 0 , 30


SALIDA

Código HTML:
Ver original
  1. id  precio Ascendente
  2.     Editar Editar   Copiar Copiar   Borrar Borrar   1128    120.000
  3.     Editar Editar   Copiar Copiar   Borrar Borrar   2096    125.000
  4.     Editar Editar   Copiar Copiar   Borrar Borrar   2174    125.147
  5.     Editar Editar   Copiar Copiar   Borrar Borrar   2139    126.352
  6.     Editar Editar   Copiar Copiar   Borrar Borrar   1385    132.500
  7.     Editar Editar   Copiar Copiar   Borrar Borrar   2173    145.258


Alguien me puede ayudar, recalcar que la base de datos tiene muchos registros aquí solo pongo un ejemplo y que los campos de precio son varchar(50) ya que el que diseño la base de datos lo puso así.

Mi principal pregunta es esa, por que me muestra lo millones cuando es menor de 80.000 y cuando pongo mayor de 80.000 no.



Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `ventas` (
  2.   `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3.   `precio` VARCHAR(50) DEFAULT NULL,
  4.   PRIMARY KEY (`id`)
  5. ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2180 ;
  6.  
  7. --
  8. -- Volcado de datos para la tabla `ventas`
  9. --
  10.  
  11. INSERT INTO `ventas` (`id`, `precio`) VALUES
  12. (253, '65.000'),
  13. (591, '30.800'),
  14. (827, '1.077.600'),
  15. (880, '1.953.700'),
  16. (954, '2.800.000'),
  17. (967, '1.150.000'),
  18. (1005, '1.595.900'),
  19. (1066, '1.690.000'),
  20. (1122, '1.150.000'),
  21. (1128, '120.000'),
  22. (1190, '1.000.000'),
  23. (1234, '1.380.000'),
  24. (1276, '1.678,00'),
  25. (1286, '27.000'),
  26. (1335, '29.000'),
  27. (1385, '132.500'),
  28. (1538, '28.800'),
  29. (1962, '79.000'),
  30. (1975, '25.000'),
  31. (2019, '24.900'),
  32. (2050, '1.100.000'),
  33. (2084, '70.000'),
  34. (2091, '80.000'),
  35. (2096, '125.000'),
  36. (2139, '126.352'),
  37. (2143, '22.000'),
  38. (2151, '30.000'),
  39. (2173, '145.258'),
  40. (2174, '125.147');
  #2 (permalink)  
Antiguo 03/07/2015, 15:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema al buscar por precio

Creo que necesitas hacer un cast o convert en tu query porque como bien lo dices estas usando valores varchar y estos no se ordenan de la misma manera que los valores numericos
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 03/07/2015, 18:01
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, 4 meses
Puntos: 2658
Respuesta: Problema al buscar por precio

Este es un tema recurrente... Vamos a ver si se entiende bien:
1) NUNCA se almacenan valores numéricos en campos VARCHAR. Para eso se han creado los INT, DECIMAL, FLOAT y los demás.
2) NUNCA se almacenan los separadores de miles. Esos NO EXISTEN para los sistemas informáticos, sino que son temas de REPRESENTACION VISUAL.
3) Cuando almacenas un numero como VARCHAR, estás a) desperdiciando espacio de almacenamiento, ya que los números no se almacenan como cifras sino como binarios, y b) generando ordenamientos erróneos.
4) Cuando realizas consultas en SQL debes recordar que EL PUNTO ES EL SEPARADOR DE DECIMALES, no de miles

Usa esto y luego la visualización de datos la resuelves en PROGRAMACION:

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `ventas` (
  2.     `precio` DECIMAL(14, 2 ) DEFAULT NULL,
  3.     PRIMARY KEY (`id`)
  4.  
  5. --
  6. -- Volcado de datos para la tabla `ventas`
  7. --
  8.  
  9. INSERT INTO `ventas` (`id`, `precio`) VALUES
  10. (253,  65000 ),
  11. (591,  30800 ),
  12. (827,  1077600 ),
  13. (880,  1953700 ),
  14. (954,  2800000 ),
  15. (967,  1150000 ),
  16. (1005,  1595900 ),
  17. (1066,  1690000 ),
  18. (1122,  1150000 ),
  19. (1128,  120000 ),
  20. (1190,  1000000 ),
  21. (1234,  1380000 ),
  22. (1276,  1678.00 ),
  23. (1286,  27000 ),
  24. (1335,  29000 ),
  25. (1385,  132500 ),
  26. (1538,  28800 ),
  27. (1962,  79000 ),
  28. (1975,  25000 ),
  29. (2019,  24900 ),
  30. (2050,  1100000 ),
  31. (2084,  70000 ),
  32. (2091,  80000 ),
  33. (2096,  125000 ),
  34. (2139,  126352 ),
  35. (2143,  22000 ),
  36. (2151,  30000 ),
  37. (2173,  145258 ),
  38. (2174,  125147 );

REspecto al punto 4:
Código MySQL:
Ver original
  1. mysql>     SELECT *
  2.     ->     FROM ventas
  3.     ->     WHERE precio > 80000
  4.     ->     ORDER BY precio ASC
  5.     ->     LIMIT 0 , 30;
  6. +------+------------+
  7. | id   | precio     |
  8. +------+------------+
  9. | 1128 |  120000.00 |
  10. | 2096 |  125000.00 |
  11. | 2174 |  125147.00 |
  12. | 2139 |  126352.00 |
  13. | 1385 |  132500.00 |
  14. | 2173 |  145258.00 |
  15. | 1190 | 1000000.00 |
  16. |  827 | 1077600.00 |
  17. | 2050 | 1100000.00 |
  18. | 1122 | 1150000.00 |
  19. |  967 | 1150000.00 |
  20. | 1234 | 1380000.00 |
  21. | 1005 | 1595900.00 |
  22. | 1066 | 1690000.00 |
  23. |  880 | 1953700.00 |
  24. |  954 | 2800000.00 |
  25. +------+------------+
  26. 16 rows in set (0.00 sec)

Por favor, presta atención a lo que te digo. Es muy importante que uses los tipos de datos CORRECTOS, y resuelvas la representación visual en la capa que corresponde, y no es en la BBDD
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 03/07/2015, 19:18
 
Fecha de Ingreso: septiembre-2011
Mensajes: 176
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Problema al buscar por precio

Hola, estoy totalmente de acuerdo contigo, pero esto es un base de datos que esta así, yo uso decimal. Voy a cambiar al campo a decimal, y luego importar los datos como indicas. Ahora tengo otro problema al importar los datos por ejemplo 150.000 coloca 150 en el campo decial, alguna idea?


Un saludo
  #5 (permalink)  
Antiguo 03/07/2015, 19:21
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema al buscar por precio

150.000=150 como bien te dijeron la representacion queda del lado de la capa de presentacion no de la capa de base de datos
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 03/07/2015, 22:27
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, 4 meses
Puntos: 2658
Respuesta: Problema al buscar por precio

Cita:
Iniciado por luisalberti Ver Mensaje
Hola, estoy totalmente de acuerdo contigo, pero esto es un base de datos que esta así, yo uso decimal. Voy a cambiar al campo a decimal, y luego importar los datos como indicas. Ahora tengo otro problema al importar los datos por ejemplo 150.000 coloca 150 en el campo decial, alguna idea?


Un saludo
Tendrás que hacer primer un update masivo antes de realizar el ALTER TABLE, para regularizar los datos:
UPDATE quitando los separadores de miles:
Código MySQL:
Ver original
  1. UPDATE ventas
  2. SET precio = REPLACE(REPLACE(precio, '.', ''), ',', '.');

Por ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT REPLACE(REPLACE('123.456,78','.', ''), ',', '.')  NUMERO;
  2. +-----------+
  3. | NUMERO    |
  4. +-----------+
  5. | 123456.78 |
  6. +-----------+
  7. 1 row in set (0.00 sec)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campo, precio, registro, select, tabla
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 02:36.