Ver Mensaje Individual
  #1 (permalink)  
Antiguo 18/12/2010, 13:54
Dany_s
 
Fecha de Ingreso: diciembre-2009
Ubicación: Misiones
Mensajes: 867
Antigüedad: 15 años, 1 mes
Puntos: 65
Obtener registro siguiente y anteior de uno específico

Hola, ayer pase unas horas intentando hacer una consulta pero no lo he logrado.

Lo que quiero es sacar el registro siguiente y el anterior a uno especifico, algo como:

idActual - idAnterior - idSiguiente
---10-----------9-------------11-----

Cuando es por ordenado por id es sencillo haciendo una subconsulta y obteniendo el mayor y el menor al id actual, pero mi problema es que intento obtener el registro anterior con menor promedio y el siguiente con mayor promedio.

Si ordeno por promedio hay muchos promedios que son iguales y los id van a estar ordenados, también intenté enumerar filas pero para ordenar me quedan los promedios desordenados.

Si alguien sabe como obtenerlos u otra solución estaría agredecido

La idea es seleccionar el promedio de una foto actual, el registro anterior que va a ser la foto que tiene menor promedio que esa actual y el siguiete

Mis tablas con los campos relevantes


Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `fotos` (
  2.   `id` INT(7) NOT NULL AUTO_INCREMENT,
  3.   PRIMARY KEY (`id`)
  4. );
  5.  
  6.  
  7. INSERT INTO `fotos` (`id`) VALUES
  8. (80), (81), (82), (83), (84), (85), (86);
  9.  
  10. CREATE TABLE IF NOT EXISTS `votos` (
  11.   `id` INT(7) NOT NULL,
  12.   `puntaje` INT(2) NOT NULL
  13. );
  14.  
  15. INSERT INTO `votos` (`id`, `puntaje`) VALUES
  16. (84, 3),(82, 4),(81, 3),(80, 4),(85, 4),(82, 3),(82, 3),(84, 5),(81, 4),(86, 4),(85, 3);


Esta es la consulta que tengo pero no funciona
Código SQL:
Ver original
  1. SELECT f.id, ROUND(AVG(v.puntaje), 1) promedio
  2. FROM fotos f, votos v
  3. WHERE v.id = f.id AND f.id <> 86
  4. GROUP BY v.id
  5. HAVING promedio <= (SELECT ROUND(AVG(v.puntaje), 1) FROM fotos f, votos v WHERE v.id = 86 AND f.id = 86)
  6. ORDER BY promedio DESC, f.id DESC
  7. LIMIT 1

Con esa intento sacar el menor a registro 86, me sale el 84 que tiene igual promedio y menor id pero cuendo saco el de 84 me muestra otra vez el 86, debería hacer una consición que sean menor al id actual pero después en otros no funciona porque los id son mayores

Gracias