Mysql
 sql >> Database >  >> RDS >> Mysql

Seleziona una riga e le righe attorno ad essa

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