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