Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Selecione uma linha e linhas ao redor dela


Apenas um ORDER BY cláusula pode ser definida para um UNION perguntaria. Não importa se você usa UNION ou UNION ALL . MySQL suporta o LIMIT cláusula em partes de um UNION 'd query, mas é relativamente inútil sem a capacidade de definir a ordem.

O MySQL também não possui funções de classificação, que você precisa para lidar com lacunas nos dados (ausentes devido à exclusão de entradas). A única alternativa é usar uma variável de incremento na instrução SELECT:
SELECT t.id, 
       @rownum := @rownum+1 as rownum 
  FROM MEDIA t, (SELECT @rownum := 0) r

Agora podemos obter uma lista numerada consecutivamente das linhas, para que possamos 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) retorna um valor de 4 . Para obter 10 linhas no total, defina o valor @upperlimit como 10. Aqui está a 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

Mas se você ainda quiser usar LIMIT , você pode 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