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

Obtener los 5 registros registros anteriores a X(id) y posteriores a X

Estas en el tema de Obtener los 5 registros registros anteriores a X(id) y posteriores a X en el foro de Mysql en Foros del Web. Hola gente: Existe alguna forma para obtener 5 registros anteriores y posteriores a un id en particular? Por ejemplo: En la tabla (MySQL) tengo: id ...
  #1 (permalink)  
Antiguo 26/09/2005, 16:13
Avatar de FuLaNo_  
Fecha de Ingreso: mayo-2003
Ubicación: Don Torcuato, Buenos Aires, Argentina
Mensajes: 1.250
Antigüedad: 20 años, 11 meses
Puntos: 2
Obtener los 5 registros registros anteriores a X(id) y posteriores a X

Hola gente:

Existe alguna forma para obtener 5 registros anteriores y posteriores a un id en particular?

Por ejemplo:

En la tabla (MySQL) tengo:

id - nombres
------------
1 - carlos
2 - pedro
3 - ignacio
4 - romina
5 - alfredo
6 - laura
7 - santiago
8 - estela
9 - valeria

Supongamos que quisiese obtener SOLO los 2 registros anteriores a "alfredo" y los 2 registros posteriores a "alfredo", existe alguna funcion mysql para esto o tengo que hacerlo con if's en PHP?
__________________
I Love Programming...
  #2 (permalink)  
Antiguo 27/09/2005, 06:08
 
Fecha de Ingreso: julio-2005
Mensajes: 38
Antigüedad: 18 años, 9 meses
Puntos: 0
Buenos días FuLaNo_

Para que te hagas una idea

Si tienes el id de Alfredo, en este caso 5.

Para sacar, por ejemplo, los 2 anterior puedes hacer.

SELECT *
FROM Tabla
WHERE id <5
ORDER BY id DESC LIMIT 2;

Espero que esto te pueda orientar

Saludos
  #3 (permalink)  
Antiguo 27/09/2005, 12:00
Avatar de FuLaNo_  
Fecha de Ingreso: mayo-2003
Ubicación: Don Torcuato, Buenos Aires, Argentina
Mensajes: 1.250
Antigüedad: 20 años, 11 meses
Puntos: 2
El problema es que yo se el "nombre" y no el ID de este nombre.. como podría hacerce en este caso?
__________________
I Love Programming...
  #4 (permalink)  
Antiguo 27/09/2005, 12:03
Avatar de tyo100  
Fecha de Ingreso: febrero-2005
Ubicación: Monterrey, NL
Mensajes: 475
Antigüedad: 19 años, 2 meses
Puntos: 1
SELECT id FROM Tabla WHERE nombre='nombre'

y asi obtienes el id

SELECT * FROM Tabla WHERE id <5 ORDER BY id DESC LIMIT 2;
__________________
Desde la tierra de los nopales, las tortillas de maiz, y en cuya ciudad se encuenta el cerro de la silla.
NalgAss Web
SpiderMex - La Historia del Hombre Araña en MEXICO
  #5 (permalink)  
Antiguo 27/09/2005, 12:05
Avatar de FuLaNo_  
Fecha de Ingreso: mayo-2003
Ubicación: Don Torcuato, Buenos Aires, Argentina
Mensajes: 1.250
Antigüedad: 20 años, 11 meses
Puntos: 2
ya lo se como obtener el ID, pero estoy intentando saber si existe alguna funcion SQL para evitarme hacer 3 consultas... (capturar el id, obtener los dos anteriors y los dos posteriores)...
__________________
I Love Programming...
  #6 (permalink)  
Antiguo 28/09/2005, 02:11
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Mira haber si te sirve así:

select * from tabla T where (id > (select id from tabla where nombre='nombre') and id < (select id + 2 from tabla where nombre='nombre')) or (id < (select id from tabla where nombre='nombre') and id > (select id - 2 from tabla where nombre='nombre'))
  #7 (permalink)  
Antiguo 28/09/2005, 10:54
Avatar de FuLaNo_  
Fecha de Ingreso: mayo-2003
Ubicación: Don Torcuato, Buenos Aires, Argentina
Mensajes: 1.250
Antigüedad: 20 años, 11 meses
Puntos: 2
Jose minglein2, dame una mano que me estoy volviendo loco:

El codigo que me diste funciona excelente, el tema es que me di cuenta que yo necesito, que en lugar de buscar el ID anterior y posterior, busque otro campo.

Te doy todo mas presciso, estoy haciendo una "tabla de posiciones" de un campeonato de futbol, la tabla tiene los campos:

id | equipo | pts

Yo necesito que me envie el registro anterior y posterior a X "equipo" pero no por ID's, sino por el campo "pts" (puntos), intente hacerlo solo pero realmente nunca habia trabajado con este tipo de sintaxis SQL (siempre hice consultas simples...) por lo que se me complica...

Lo que necesito es obtener el registro anterior y posterior a "Ferrocarril Oeste" por "pts" y no por ID.

Ejemplo

La tabla tiene:
id | equipo | pts

1 | Ferrocarril Oeste | 10
2 | Huracán | 15
3 | Aldosivi | 9
4 | Platense | 11
5 | Tigre | 7
6 | Moron | 12

Yo necesito una consulta que me de este resultado:
Moron (12)
Platence (11)
Ferrocarril Oeste (10)
Aldosivi (9)
Tigre (7)

La consulta que hice fue:

Código PHP:
SELECT FROM `fw_futbol_posT WHERE (`pts` > (SELECT `pts`, `idFROM `fw_futbol_posWHERE `equipo` = 'Ferrocarril Oeste') AND `pts` < (SELECT `pts`, `id` + 2 FROM fw_futbol_pos WHERE `equipo` = 'Ferrocarril Oeste')) OR (`pts` < (SELECT `pts`, `idFROM `fw_futbol_posWHERE `equipo` = 'Ferrocarril Oeste') and `pts` > (SELECT `pts`, `id` - 2 FROM `fw_futbol_posWHERE `equipo` = 'Ferrocarril Oeste')) 
El error que me envia es:
Cita:
#1241 - Operand should contain 1 column(s)
Espero que me des "otra" mano.

Saludos y gracias.
__________________
I Love Programming...
  #8 (permalink)  
Antiguo 29/09/2005, 01:33
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Código:
SELECT * FROM fw_futbol_pos T WHERE pts > (SELECT pts FROM fw_futbol_pos WHERE equipo = 'Ferrocarril Oeste') ORDER BY pts LIMIT 2
UNION
SELECT * FROM fw_futbol_pos T WHERE pts < (SELECT pts FROM fw_futbol_pos WHERE equipo = 'Ferrocarril Oeste') ORDER BY pts DESC LIMIT 2
Con esto haces lo que quieres, pero lo que creo es que no te los obtendrá en el orden correcto. Miralo y me dices.

Un saludo
  #9 (permalink)  
Antiguo 29/09/2005, 10:34
Avatar de FuLaNo_  
Fecha de Ingreso: mayo-2003
Ubicación: Don Torcuato, Buenos Aires, Argentina
Mensajes: 1.250
Antigüedad: 20 años, 11 meses
Puntos: 2
José, que hace ese "union" ahi?? esas dos lineas van unidas o son dos consultas separadas?
__________________
I Love Programming...
  #10 (permalink)  
Antiguo 29/09/2005, 11:43
Avatar de FuLaNo_  
Fecha de Ingreso: mayo-2003
Ubicación: Don Torcuato, Buenos Aires, Argentina
Mensajes: 1.250
Antigüedad: 20 años, 11 meses
Puntos: 2
Hola, al realizar la consulta me envia este error:

#1221 - Incorrect usage of UNION and ORDER BY

El codigo que estoy usando es identico al que me diste:

Código:
SELECT * FROM fw_futbol_pos T WHERE pts > (SELECT pts FROM fw_futbol_pos WHERE equipo = 'Ferrocarril Oeste') ORDER BY pts LIMIT 2
UNION
SELECT * FROM fw_futbol_pos T WHERE pts < (SELECT pts FROM fw_futbol_pos WHERE equipo = 'Ferrocarril Oeste') ORDER BY pts DESC LIMIT 2
__________________
I Love Programming...
  #11 (permalink)  
Antiguo 29/09/2005, 11:59
Avatar de FuLaNo_  
Fecha de Ingreso: mayo-2003
Ubicación: Don Torcuato, Buenos Aires, Argentina
Mensajes: 1.250
Antigüedad: 20 años, 11 meses
Puntos: 2
Hermano, que puedo decir, sos un genio!

Cambie algunas tonterias (Quizas tu ya sabias que debian ir, pero yo soy principiante con MySQL :p) y ha funcionado perfectamente:

Código:
(SELECT * FROM fw_futbol_pos T WHERE pts > (SELECT pts FROM fw_futbol_pos WHERE equipo = 'Ferrocarril Oeste') ORDER BY pts DESC LIMIT 2)
UNION
(SELECT * FROM fw_futbol_pos T WHERE pts <= (SELECT pts FROM fw_futbol_pos WHERE equipo = 'Ferrocarril Oeste') ORDER BY pts DESC LIMIT 3)
Me faltaban las () cerrando los SELECT's generales. Tambien agradesco a mysql hispano que alli fue donde encontre el error (este articulo)

Muchas gracias y ya estaré por aqui nuevamente con dudas ;)
__________________
I Love Programming...
  #12 (permalink)  
Antiguo 30/09/2005, 00:32
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
De nada hombre, lo de los parentesis, es que no se muy bien como va, a veces funciona sin parentesis y otras veces no, es cuestión de probar.Me alegro de que ya te funcione.


Un saludo.
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 18:08.