Un solo ORDER BY
La clausola può essere definita per un UNION
farei una domanda. Non importa se usi UNION
o UNION ALL
. MySQL supporta il LIMIT
clausola su porzioni di un UNION
'd query, ma è relativamente inutile senza la possibilità di definire l'ordine.
MySQL manca anche di funzioni di classificazione, necessarie per affrontare le lacune nei dati (mancanti a causa dell'eliminazione delle voci). L'unica alternativa è utilizzare una variabile incrementale nell'istruzione SELECT:
SELECT t.id,
@rownum := @rownum+1 as rownum
FROM MEDIA t, (SELECT @rownum := 0) r
Ora possiamo ottenere un elenco di righe numerato consecutivamente, quindi possiamo usare:
WHERE rownum BETWEEN @midpoint - ROUND(@midpoint/2)
AND @midpoint - ROUND(@midpoint/2) [email protected]
Usando 7 come valore per @midpoint, @midpoint - ROUND(@midpoint/2)
restituisce un valore di 4
. Per ottenere 10 righe in totale, imposta il valore @upperlimit su 10. Ecco la query 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
Ma se vuoi ancora usare LIMIT
, puoi usare:
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