sql >> Base de Datos >  >> RDS >> Mysql

Seleccione una fila y filas a su alrededor

Solo un ORDER BY la cláusula se puede definir para un UNION preguntaría. No importa si usas UNION o UNION ALL . MySQL admite el LIMIT cláusula sobre partes de un UNION consultaría, pero es relativamente inútil sin la capacidad de definir el orden.

MySQL también carece de funciones de clasificación, que necesita para lidiar con las lagunas en los datos (que faltan debido a la eliminación de entradas). La única alternativa es usar una variable incremental en la sentencia SELECT:

SELECT t.id, 
       @rownum := @rownum+1 as rownum 
  FROM MEDIA t, (SELECT @rownum := 0) r

Ahora podemos obtener una lista numerada consecutivamente de las filas, por lo que podemos usar:

WHERE rownum BETWEEN @midpoint - ROUND(@midpoint/2) 
                 AND @midpoint - ROUND(@midpoint/2) [email protected]

Usando 7 como valor para @midpoint, @midpoint - ROUND(@midpoint/2) devuelve un valor de 4 . Para obtener 10 filas en total, establezca el valor @upperlimit en 10. Esta es la consulta completa:

SELECT x.* 
  FROM (SELECT t.id, 
               @rownum := @rownum+1 as rownum 
          FROM MEDIA t, 
               (SELECT @rownum := 0) r) x
 WHERE x.rownum BETWEEN @midpoint - ROUND(@midpoint/2) AND @midpoint - ROUND(@midpoint/2) + @upperlimit

Pero si todavía quieres usar LIMIT , puedes usar:

  SELECT x.* 
    FROM (SELECT t.id, 
                 @rownum := @rownum+1 as rownum 
            FROM MEDIA t, 
                 (SELECT @rownum := 0) r) x
   WHERE x.rownum >= @midpoint - ROUND(@midpoint/2)
ORDER BY x.id ASC
   LIMIT 10