Newsgroup: it.comp.www.php
Titolo: Selezionare un sottoinsieme di righe

Salve a tutti,
per la mia applicazione web utilizzo un database Oracle 9i.
In alcune pagine, devo visualizzare il contenuto di tabelle piuttosto
grandi. Ho optato (o meglio sono costretto) per visualizzare le righe
in più pagine in base a una grandezza scelta dall'utente tramite una
form.
Per dare all'utente la possibilità di visualizzare il numero di pagine
in cui è stata suddivisa la tabella mi occorre il numero totale di
righe:
$pages = ceil($rowcount/$num_records);
dove $pages è il numero di pagine, $rowcount è il numero totale di
righe e $num_records è il numero di righe per pagine di default o
scelto dall'utente.
Il valore di $rowcount è calcolato dalla seguente query:
$sql = "SELECT COUNT(*) AS NROWS " .
       "FROM NOME_TABELLA";
Dopodiché, in base al numero di pagina e al numero di righe scelti
dall'utente, visualizzo le righe della tabella:
$limit_sup = $num_page * $nrec_records;
$limit_inf = $limit_sup - $num_records + 1;
$sql = "SELECT COLONNA_1, COLONNA_2, ... " .
       "FROM (" .
       "SELECT ROWNUM AS RN, COLONNA_1, COLONNA_2, ... " .
       "FROM NOME_TABELLA" .
       ") " .
       "WHERE RN BETWEEN ".$limit_inf." AND ".$limit_sup;
Così facendo, l'utente ha la possibilità di visualizzare una tabella
"grande" in più pagine e può passare da una pagina all'altra senza
problemi.
I miei dubbi si concentrano però sull'efficienza di questo codice che
esegue due query distinte e, se le tabelle sono molto grandi, non
"leggerissime" con un tempo di attesa non eccessivo, ma neanche
"banale".
Come si potrebbe ottimizzare questa funzionalità? Occorre impostare
un'altra strategia?
Grazie e a presto.
Giuseppe

 form.
select *
  from ( select a.*, rownum rnum
           from (
YOUR_QUERY_GOES_HERE -- including the order by
                   ) a
          where rownum <= MAX_ROWS )
 where rnum >= MIN_ROWS
/

Forse l'oggetto del post non era proprio azzeccato, ma il mio problema
non è come selezionare un sottoinsieme di righe, infatti nella seconda
parte del post (non inclusa nella risposta di 
a.tr...@gmail.com
) viene
esplicitamente mostrato come avviene la selezione e il calcolo delle
pagine (di seguito riporto uno stralcio del post originale):
// Query per determinare il numero totale di righe
$sql = "SELECT COUNT(*) AS NROWS " .
          "FROM NOME_TABELLA";
// Numero di pagine in cui viene suddivisa la tabella
$pages = ceil($rowcount/$num_records);
// Selezione del set di righe scelto dall'utente
$limit_sup = $num_page * $nrec_records;
$limit_inf = $limit_sup - $num_records + 1;
$sql = "SELECT COLONNA_1, COLONNA_2, ... " .
          "FROM (" .
          "SELECT ROWNUM AS RN, COLONNA_1, COLONNA_2, ... " .
          "FROM NOME_TABELLA" .
          ") " .
          "WHERE RN BETWEEN ".$limit_inf." AND ".$limit_sup;
Il mio problema risiede nel fatto che il calcolo delle pagine non mi
sembra efficiente.
Se non avessi bisogno di conoscere il numero di pagine, la prima query
non occorrerebbe e la seconda query (quasi identica a quella proposta
da 
a.tr...@gmail.com
) basterebbe.
Poiché oltre alla selezione, mi pongo l'obiettivo di determinare il
numero di pagine è necessario conoscere il numero totale di righe.
Faccio un esempio:
Ho una tabella PIPPO.
L'utente decide di visualizzare 10 record per pagina.
Voglio far vedere all'utente le pagine in cui viene suddivisa la
tabella in modo che possa andare da una pagina all'altra (ad esempio
passando dalla prima alla terza senza visualizzare la seconda). Quindi
calcolo il numero di record totale con la prima query che è, ad
esempio, 50 e avrò 5 pagine.
Dopodiché utilizzo la seconda query per selezionare 10 record della
tabella in base alla scelta dell'utente (ad esempio se vorrà
visualizzare la terza pagina, seleziona i record che vanno dal 21° al
30°).
Come posso rendere più efficiente questo meccanismo?
Peppe
a.tr...@gmail.com
 ha scritto:
