Estrazione da db MySQL con query molto lunga

Fxxxx

Utente Attivo
17 Set 2011
63
0
0
Salve
Dovrei estrarre da un db mysql una serie di righe usando gli ID che sono contenuti in un array. Il numero di queste righe è molto alto: di base pensavo a 100 e al click dell'utente ne vengono caricati altri 100 (e quindi la query diventa di 200) e così via... quindi se l'utente clicca 7 volte la query deve estrarre 700 righe, numero molto elevato usando gli ID

La soluzione potrebbe essere usare:
PHP:
$query = "SELECT * FROM table WHERE id IN (12, 5, 77, 123...)";
oppure creando una query per ogni riga ma questo mi sembra molto dispendioso... non è così???

Per la prima soluzione mi sembra di aver letto che le query hanno un limite di lunghezza giusto? quindi non potrebbe essere infinita... giusto?

Cosa fareste voi?

Grazie
 
Potresti provare cosi se ho capito bene

Codice:
SELECT * FROM table WHERE id<=200 AND id>=100
 
e no... perché i numeri (gli id) non sono dal 100 al 200 ma sono discontinui tipo: 2, 6, 34, 67, 100, 3, 35... (questi 100 o 200 0 300...)
 
e no... perché i numeri (gli id) non sono dal 100 al 200 ma sono discontinui tipo: 2, 6, 34, 67, 100, 3, 35... (questi 100 o 200 0 300...)

Se non sono in un ordine numerico 'manipolabile' allora con che criterio vengono selezionati scusa?
 
Gli id di cui voglio estrarre le info sono contenuti in un array (creato con un certo criterio, che è ininfluente nel problema della lunghezza della query)
 
ciao
se per ipotesi tu hai una tabella del tipo
id|titolo|testo
potresti provare a fare così, un'unica interrogazione e poi tutto con script
PHP:
<?php
$array_di_id=array(882, 2, 6, 34, 67, 100, 3, 35, 99, 3897);
$query = mysql_query("SELECT * FROM table ORDER BY id");
while($riga=mysql_fetch_assoc($query)){
	if(in_array($riga['id'], $array_di_id){
		$testo[]=$riga;//$testo[0][id], $testo[0][titolo],$testo[0][testo],$testo[1][id], $testo[1][titolo],$testo[1][testo]ecc... con i relativi valori del campo
	}
}
foreach($testo as $ch_1 => $val_1){
	echo "<hr>";
	foreach($testo[$ch] as $ch_2 => $val_2){
		echo $val_2['titolo']."<br />".$val_2['testo'];
	}
	echo "<hr>";
}
?>
prova al massimo non funzia
 
è una buona idea ma non sarà anche questa dispendiosa? In questo modo la query restituisce tutte le righe... ipotizzando di avere 100000 righe il ciclo while diventa lunghissimo... no? Non diventerebbe troppo dispendioso?
 
La soluzione di borgo mi sembra buona però cosi ogni volta devi ciclare tutti gli id, a questo punto perché non inserire direttamente l'array numerico nella query?

PHP:
$query = mysql_query("SELECT * FROM table WHERE id IN(".join(',',$array).")");
 
ho già detto qual è per me il problema di questa risoluzione: ho letto che le query non possono essere troppo lunghe... immagine di estrarre 700 righe con id che sono anche abbastanza lunghi... la query risulterebbe molto lunga... non sarebbe un problema? cosa dite?
 
ho già detto qual è per me il problema di questa risoluzione: ho letto che le query non possono essere troppo lunghe... immagine di estrarre 700 righe con id che sono anche abbastanza lunghi... la query risulterebbe molto lunga... non sarebbe un problema? cosa dite?
Con l'esempio mostrato sopra prendere tutti gli id dell'array, non tutti quelli nel database, quindi è l'array che dovrebbe avere tale quantità, comunque è fattibile ugualmente, al massimo caricherà per alcuni secondi dato che è solo una select
 
quindi per te non ci sono limiti di lunghezza per una query? perché avevo letto che ce n'era... e quindi mi sono allarmato...
Per voi quindi qual è la migliore soluzione?
 
quindi per te non ci sono limiti di lunghezza per una query? perché avevo letto che ce n'era... e quindi mi sono allarmato...
Per voi quindi qual è la migliore soluzione?
Per me te l'ho detto, selezionare solo gli id inerenti all'array che viene formulato nello script

edit: ho letto un po sul sito di mysql riguardante max_allowed_packet, e pare che sia la quantità massima di dati inviabili quindi non la lunghezza vera e propria, forse per le interrogazioni non c'è un limite prefissato, quindi non farti tanti scrupoli
 
Ultima modifica:
ciao
fai delle prove
PHP:
<?php
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
$inizio=microtime_float();
/*
qui una volta un sistema
poi l'altro
*/
$fine=microtime_float();
$durata=$fine-$inizio;
echo "messi $durata secondi";
?>
e valuti quale è il più rapido
 
ringrazio entrambi! quando avrò un db + pieno testerò tutte e due le soluzioni per vedere qual è la più veloce... se ho altri dubbi su questo argomento vi faccio sapere qui
Grazie e a presto!
 

Discussioni simili