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

Consultar usuarios por rango de edad

Estas en el tema de Consultar usuarios por rango de edad en el foro de Mysql en Foros del Web. Saludos a todos y todas: Tengo unas dudas con la forma de hacer una consulta. En este caso se trata de buscar en una tabla ...
  #1 (permalink)  
Antiguo 26/12/2012, 02:28
Avatar de ricardo_tu  
Fecha de Ingreso: noviembre-2010
Ubicación: Mas aca del mas alla
Mensajes: 222
Antigüedad: 13 años, 5 meses
Puntos: 32
Consultar usuarios por rango de edad

Saludos a todos y todas:
Tengo unas dudas con la forma de hacer una consulta. En este caso se trata de buscar en una tabla de registro de usuarios según varios (3) criterios.

El primer criterio es su país , el segundo su ciudad, el tercero su rango de edad.

La consulta está así :
Código MySQL:
Ver original
  1. SELECT * FROM base
  2. WHERE ciudad = '$ciudad' AND pais = '$pais'
Pero no consigo generar la consulta para buscarles por rango de edad (18 a 24 ; 25 a 29; etc). Según he leído se hace con between, pero no lo he logrado.

Quiero conseguir que un usuario pueda por ejemplo buscar a alguien que vive en:
Chile / La Serena / de 25 a 29 años.

Desde ya muchas gracias.
__________________
La ciencia al poder. Pazciencia ya viene

Última edición por gnzsoloyo; 26/12/2012 a las 03:33 Razón: Código de programación no permitido en foros d ebases de datos. Etiquetado erróneo.
  #2 (permalink)  
Antiguo 26/12/2012, 05:42
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: Consultar usuarios por rango de edad

El uso de BETWEEn es bastante elemental, simplemente busca un rango de datos entre dos parámetros de menor y mayor
Código MySQL:
Ver original
  1. BETWEEN valorMenor AND valorMayor
No veo qué es lo que puede resultarte confuso en su uso. Pero como no estás posteando qué fue lo que intentaste, es dificil poder darte una respuesta concreta.
El único problema que puedo suponer es que no sabes cómo calcular la edad basado en una fecha, o bien que estés usando campos de tipos incorrectos para almacenar las fechas de nacimiento de las personas, o que simplemente no hayas leído las funciones de fecha que tiene MySQL para esto, o bien no tengas claro cómo conviene usarlas.
¿Cuál es exactamente el problema?

PD: No postees código PHP en este foro. Sólo SQL.
__________________
¿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 26/12/2012, 12:20
Avatar de ricardo_tu  
Fecha de Ingreso: noviembre-2010
Ubicación: Mas aca del mas alla
Mensajes: 222
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Consultar usuarios por rango de edad

gnzsoloyo, gracias por responder.
Intentare explicarme mejor.
Quiero generar que una consulta contemple tres parámetros.
Lo que no he conseguido es incluir el el parámetro "rango de edad" en la consulta. Si bien between parece ser lo adecuado no sé donde ni como ponerlo en la consulta.
Código SQL:
Ver original
  1. SELECT * FROM base
  2.  
  3. WHERE ciudad = '$ciudad' AND pais = '$pais'
  4.  
  5. ORDER BY id DESC

Por ejemplo (se que está mal):

Código SQL:
Ver original
  1. SELECT * FROM base
  2.  
  3. WHERE ciudad = '$ciudad' AND pais = '$pais' BETWEEN edad =valorMenor AND valorMayor
  4.  
  5. ORDER BY id DESC
__________________
La ciencia al poder. Pazciencia ya viene
  #4 (permalink)  
Antiguo 26/12/2012, 12:46
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: Consultar usuarios por rango de edad

Probablemente no se ha entendido, pero el BETWEEN necesita ser aplicado a una columna que se compara con un rango, o bien un valor por parámetro se compara contra un rango definido por dos columnas.
Código MySQL:
Ver original
  1. columnaDeTabla BETWEEN parametro1, AND parametro2
o bien
Código MySQL:
Ver original
  1. parametroBuscado BETWEEN columna1 AND columna2

En cualquiera de los dos casos, al menos uno de los componentes debe estar en el registro de la tabla usada; o el valor o el rango.
Lo que no puede ser es que los tres componentes (valor, límite inferior y límite superior) lleguen como parámetros por programación.
Nunca.

Un detalle más: Una edad es algo móvil, porque siempre se referencia a la fecha actual al momento de la ejecución de la consulta. Jamás se almacena como numero, sino que lo que se almacena es la fecha de nacimiento.
La edad siempre se origina en un cálculo, y los valores calculables no se guardan jamás en 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)
  #5 (permalink)  
Antiguo 26/12/2012, 17:02
Avatar de ricardo_tu  
Fecha de Ingreso: noviembre-2010
Ubicación: Mas aca del mas alla
Mensajes: 222
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Consultar usuarios por rango de edad

Gnzsoloyo, gracias una vez mas. Siento que abuso de tu buena voluntad pero quiero explicar con mas claridad lo que busco conseguir.
Te cuento la historia larga:
A través de un formulario un usuario se registra indicando sus datos y esos datos va tal cual a un BD.
nombre. Juan / país. Chile / ciudad. La Serena/ Edad. 30

Luego otro usuario busca personas con algunos criterios

En un formulario indica
El país, la cuidad y la edad (dentro de rangos ej. de 20 a 25 años) y con esos criterio genero una consulta

La pregunta del millón es: ¿Como hago para, en una misma consulta, buscar por los parámetros indicados?

Hasta ahora logre buscar por país y cuidad, pero no veo como agregar el tercer ingrediente LA EDAD (por rangos etáreos)

Agradezco tu buena voluntad, como vez no hay ningún campo calculable ni nada de eso, solo quiero que la consulta muestre a: Los de un país, de una ciudad y de una cierta edad.

Muchísimas gracias por tu paciencia
__________________
La ciencia al poder. Pazciencia ya viene
  #6 (permalink)  
Antiguo 26/12/2012, 18:46
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: Consultar usuarios por rango de edad

Partamos de la base que aún no nos has posteado la estructura que esa tabla tiene, por lo que no tengo ni idea acerca de la forma en que almacenas el dato que permita determinar la edad.
Yo ya te dije que eso se hace almacenando la fecha de nacimiento. SI la pones de otra forma puede terminar dando resultados incorrectos. No es aconsejable.
Postea la estructura de la tabla (el CREATE TABLE, no una descripción), y veremos.
Sin eso estaremos fantaseando, pero si sólo aplicas razonamiento ya a estas alturas podrías desarrollarlo por ti mismo. No necesitas mucho más...

PD: No nos interesa el formulario. El formulario no existe para la base de datos. Nos interesa la estructura de la tabla y los datos que hay en ella.
El formulario es programación, y no nos aporta absolutamente nada, porque en este foro no resolvemos cuestiones de programación, sino de consultas en SQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 26/12/2012, 19:32
Avatar de ricardo_tu  
Fecha de Ingreso: noviembre-2010
Ubicación: Mas aca del mas alla
Mensajes: 222
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Consultar usuarios por rango de edad

Gracias gnzsoloyo
No veo tan difícil la cosa de entender mi pregunta.
Para que no te enrolles con la edad, piensa que es un precio en una tabla y quiero ver productos que se venden en Angola, en la ciudad Luanda con precios entre dos valores: uno mínimo y otro máximo.

En concreto
Hay un campo que se llama EDAD y se rellena con la edad que declara el usuario al responder la pregunta ¿que edad tienes?

Luego en la consulta quiero buscar en el campo edad pero dentro de rangos (ej 20 a 30 ó 40 a 60 etc).

La pregunta es clara:
¿como redacto una consulta que haga una búsqueda con tres criterios?
1 El pais
2 La cuidad
3 La edad (declarada por el usuario, nada de cálculos ni similar)

Para los dos primeros criterios me funciona bien, solo falta redactar el tercer criterio de búsqueda.

Te pongo el código a lo mandril:
Código SQL:
Ver original
  1. SELECT * FROM base
  2. WHERE ciudad = '$ciudad' AND
  3. pais = '$pais' Y EDAD DECLARADA ENTRE $minimo Y $ maximo
  4. ORDER BY id DESC;

Para que veas la tabla
Código SQL:
Ver original
  1. CREATE TABLE `base` (
  2.   `id` INT(50) NOT NULL AUTO_INCREMENT,
  3.   `nombre` VARCHAR(60) COLLATE latin1_general_ci NOT NULL,
  4.   `edad` VARCHAR(3) COLLATE latin1_general_ci NOT NULL,
  5.   `email` VARCHAR(60) COLLATE latin1_general_ci NOT NULL,
  6.   `pais` VARCHAR(20) COLLATE latin1_general_ci NOT NULL,
  7.   `ciudad` VARCHAR(25) COLLATE latin1_general_ci NOT NULL,
  8.   `codigo` VARCHAR(15) COLLATE latin1_general_ci NOT NULL,
  9.   `fecha` VARCHAR(20) COLLATE latin1_general_ci NOT NULL,
  10.   `contra` VARCHAR(25) COLLATE latin1_general_ci NOT NULL,
  11.  
  12.   PRIMARY KEY (`id`),
  13.   UNIQUE KEY `codigo` (`codigo`)
  14. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=27 ;
__________________
La ciencia al poder. Pazciencia ya viene

Última edición por gnzsoloyo; 26/12/2012 a las 20:30
  #8 (permalink)  
Antiguo 26/12/2012, 20:55
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: Consultar usuarios por rango de edad

Yo no me enrrollo, pero me has estado dando vueltas sin responder esa pregunta.
Para mi, es increíble que puedas llegar a este punto:
Código MySQL:
Ver original
  1. FROM base
  2.     ciudad = '$ciudad'
  3.     AND pais = '$pais'
  4.     Y EDAD DECLARADA ENTRE $minimo Y $ maximo
Y no ser capaz de escribir por ti mismo algo como:
Código MySQL:
Ver original
  1. FROM base
  2.     ciudad = '$ciudad'
  3.     AND pais = '$pais'
  4.     AND edad BETWEEN $minimo AND $ maximo
Y saltar de allí a rangos múltiples como
Código MySQL:
Ver original
  1. FROM base
  2.     ciudad = '$ciudad'
  3.     AND pais = '$pais'
  4.     AND
  5.     (edad BETWEEN 20 AND 30
  6.     OR
  7.     edad  BETWEEN 40 AND 60)
  8. ORDER BY edad, id DESC;
Francamente no comprendo cómo es que no lo ves, cuando ya lo estás escribiendo en pseudocódigo.

Además, postear las tablas es un requisito casi básico en este foro, porque hay cosas que no se perciben en lo que el forista describe, como por ejemplo, que estás cometiendo un error gravísimo al crear esa tabla, por cuanto estás poniendo como VARCHAR un campo de edad.
Una edad es una magnitud, y como tal sólo puede ser almacenada como número, en este caso un INT UNSIGNED, y jamás como texto.
Cuando almacenas la edad como texto, el numero se evalúa como texto, lo que hace que en el rango, "100" esté antes que "2"... Lo que es obviamente un error total (hay otras palabras para describirlo, pero no las pondré).
Y eso no lo puedo saber a menos que vea qué estructura tiene la tabla, porque tu me estás hablando de un campo "edad", del que yo asumo (porque es evidente que debe ser así) que es numérico. Y no es tal.

¿Se entiende?

También veo que estás almacenando la fecha como VARCHAR, lo que es otro error catastrófico. Supongo porque la estas guardando como DD/MM/AAAA, lo que también está mal.
Una fecha es una columna de tipo DATE, TIMESTAMP o DATETIME, pero jamás un VARCHAR. Cuando la pones como tal puede terminar siendo que el 31/01/1645 sea mayor (posterior) al 02/12/2578, lo que es obviamente absurdo.
Ese tipo de error es muy común en los programadores, que confunden la fecha para mostrar en pantalla, con el formato de almacenamiento de datos.
Son cosas totalmente distintas.

¿Se van entendiendo los problemas que se plantean en tu modelado de datos?

Si voy a hilar fino, incluso las longitudes de los campos VARCHAR son incorrectas, porque no cumplen con lo necesario para la mayoría de los casos y pueden terminar truncando datos, lo que generaría errores graves en las consultas y reportes.
La tabla debería ser mas o menos así:
Código MySQL:
Ver original
  1. CREATE TABLE `base` (
  2.   `nombre` VARCHAR(100) NOT NULL,
  3.   `edad` INT UNSIGNED NOT NULL,
  4.   `email` VARCHAR(255) NOT NULL,
  5.   `pais` VARCHAR(60) NOT NULL,
  6.   `ciudad` VARCHAR(100) NOT NULL,
  7.   `codigo` VARCHAR(15) NOT NULL,
  8.   `fecha` DATE NOT NULL,
  9.   `contra` VARCHAR(25) NOT NULL,
  10.   PRIMARY KEY (`id`),
  11.   UNIQUE KEY `codigo` (`codigo`)
  12. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
Hay algunas otras consideraciones como por ejemplo:
- INT(50) es incorrecto, porque ni un BIGINT tiene esa cantidad de cifras, y ese valor entre paréntesis no representa tampoco la el ancho de la cifra. El máximo en INT es 11, por ejemplo.
- Los países y ciudades es mejor que estén en tablas independientes, relacionadas por FK con esta, donde lo único que se pone es el ID del país y el ID de la ciudad, y no el nombre.
- "Codigo" termina siendo una PK alternativa cuando la declaras como UNIQUE. No se comprende su uso, pero si es numérico no debería ir como VARCHAR.

Puede que esto te parezca demasiado y que lo único que desees sea "la consulta", pero entiende que una base mal diseñada, sólo devolverá datos-basura (información incorrectamente procesada o errónea), porque no cumple con lo necesario para dar buenos resultados.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 26/12/2012, 22:24
Avatar de ricardo_tu  
Fecha de Ingreso: noviembre-2010
Ubicación: Mas aca del mas alla
Mensajes: 222
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Consultar usuarios por rango de edad

Te quedo infinitamente agradecido, por tu voluntad y buenos consejos.
__________________
La ciencia al poder. Pazciencia ya viene

Etiquetas: consultar, edad, rango, select, sql, tabla, usuarios
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 10:50.