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

No sé como explicarlo, pero a ver

Estas en el tema de No sé como explicarlo, pero a ver en el foro de Mysql en Foros del Web. Buenas, si supiera enunciar el problema podría buscar por google, pero aun así, ya que estoy aquí, a ver si alguno de vosotros, que tenéis ...
  #1 (permalink)  
Antiguo 16/12/2014, 10:40
 
Fecha de Ingreso: noviembre-2008
Mensajes: 10
Antigüedad: 16 años, 1 mes
Puntos: 0
Pregunta No sé como explicarlo, pero a ver

Buenas, si supiera enunciar el problema podría buscar por google, pero aun así, ya que estoy aquí, a ver si alguno de vosotros, que tenéis más habilidad y costumbre, ve enseguida el problema y la solución.

Tengo una tabla llamada Tabla, con 3 campos: id (autoincremental), nombre y edad:

1 - Paco - 20
2 - Luis - 30
3 - Ana - 15
4 - Pepe - 60
5 - Juan - 20

Lo que quiero hacer es una especie de query recursiva. Que vaya pasando de registro en registro y comprabando si el campo edad es mayor que la anterior, como un bucle for, pero en mysql. Si la edad de un registro es mayor que la que va justamente antes, la saca en pantalla, sino, la salta.

No sé si me expliqué bien
  #2 (permalink)  
Antiguo 16/12/2014, 10:51
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 19 años, 3 meses
Puntos: 0
Respuesta: No sé como explicarlo, pero a ver

Hola,

creo que debería ser:

Código SQL:
Ver original
  1. SELECT primera.id, primera.nombre, primera.edad
  2. FROM tabla AS primera
  3. WHERE primera.edad>(
  4.     SELECT segunda.edad
  5.     FROM tabla AS segunda
  6.     WHERE segunda.id=(primera.id-1)
  7.     );
Saludos

Última edición por gnzsoloyo; 16/12/2014 a las 11:05 Razón: Corrección
  #3 (permalink)  
Antiguo 16/12/2014, 11:01
 
Fecha de Ingreso: noviembre-2008
Mensajes: 10
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: No sé como explicarlo, pero a ver

Cita:
Iniciado por xinxan22 Ver Mensaje
Hola,

creo que debería ser:
Código SQL:
Ver original
  1. SELECT id, nombre, edad
  2. FROM tabla
  3. WHERE edad>( subconsulta) ;
Y en subconsulta coger la edad del id_anterior

Saludos
Sí, así lo tenía antes, pero lo compara todo con el segundo registro solo, no el siguiente con su anterior, necesito que sea recursivo.

Código MySQL:
Ver original
  1. SELECT * FROM Tabla
  2. WHERE edad > (SELECT edad FROM Tabla ORDER BY id LIMIT 1,1);
[/CODE]

Última edición por gnzsoloyo; 16/12/2014 a las 11:07
  #4 (permalink)  
Antiguo 16/12/2014, 11:07
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 19 años, 3 meses
Puntos: 0
Respuesta: No sé como explicarlo, pero a ver

Hola,

perdona, he escrito 3 veces la respuesta, la primera mal, la segunda con la idea cual sería la tercera que es la que hay ahora es la correcta que necesitas.

Saludos
  #5 (permalink)  
Antiguo 16/12/2014, 11:53
 
Fecha de Ingreso: noviembre-2008
Mensajes: 10
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: No sé como explicarlo, pero a ver

Gracias! estoy funciona, el problema ahora es que hay ids que no van seguidos porque se eliminaron algunos registros, y al hacer el -1 pincha
  #6 (permalink)  
Antiguo 16/12/2014, 12:13
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 19 años, 3 meses
Puntos: 0
Respuesta: No sé como explicarlo, pero a ver

Hola,

Pues ahora mismo no se me ocurre el problema de los ids que faltan, quizás generando otra columna como código y en vez de hacer id hacer codigo, entonces lo vas rellenando que sea anterior+1 como si fuera un autonumérico creado por ti, otra opción es hacer un procedure.

En un procedure puedes hacer un select, un bucle y un if y vas revisando.

Saludos
  #7 (permalink)  
Antiguo 16/12/2014, 12:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: No sé como explicarlo, pero a ver

Cita:
Iniciado por Luisfa Ver Mensaje
Buenas, si supiera enunciar el problema podría buscar por google, pero aun así, ya que estoy aquí, a ver si alguno de vosotros, que tenéis más habilidad y costumbre, ve enseguida el problema y la solución.

Tengo una tabla llamada Tabla, con 3 campos: id (autoincremental), nombre y edad:

1 - Paco - 20
2 - Luis - 30
3 - Ana - 15
4 - Pepe - 60
5 - Juan - 20

Lo que quiero hacer es una especie de query recursiva. Que vaya pasando de registro en registro y comprabando si el campo edad es mayor que la anterior, como un bucle for, pero en mysql. Si la edad de un registro es mayor que la que va justamente antes, la saca en pantalla, sino, la salta.

No sé si me expliqué bien
Es técnicamente posible, pero eso está mas del lado de la programación que de la consulta.
En todo caso, en MySLQ hay dos formas de hacer lo que quieres, pero la más precisa es algo complicada, y requiere una explciación y pruebas algo largas. No es para principiantes, sin ofender.
La segunda la podemos plantear así:
Ordenamos de menor a mayor las edades, y los IDs, y hacemos que devuelva el priemro de cada edad encontrada, de ese modo el segundo registro será siempre el primero que entró con mayor edad que el primero.
Sería mas o menos así:
Código MySQL:
Ver original
  1. SELECT id, nombre, edad
  2.   SELECT id, nombre, edad
  3.   FROM tabla T
  4.   ORDER BY edad ASC, id ASC) T1
  5. GROUP BY edad;
Atención: Esta consulta funciona sólo en MySQL. No la peudes usar en ningún otro DBMS porque te daría error de ejecución por restricciones de la clausula GROUP BY que no se aplican a MySQL.
__________________
¿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: bucle, recursivo
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 11:21.