- Home
- Categorie
- Coding e Sistemistica
- Coding
- Chiamata multipla di query
-
Chiamata multipla di query
Buonasera.
Questo il mio problema.
Ho una tabella nella quale ogni record contiene dati relativi ad un CD musicale (titolo, autore, ecc.). Tra questi è presente anche il valore booleano "attivo".
Tramite apposito codice vengono contati i record presenti nella tabella e viene scelto un numero casuale (random_call).
Dal momento che il record selezionato potrebbe essere non attivo (ovvero attivo==FALSE) faccio una verifica (random_cd_check).
Nel caso in cui l'esito sia positivo, si procede con l'esecuzione del codice, diversamente viene ripetuta la procedura dall'inizio.Questo il codice:
[php]
function random_call($db){
$query_random_cd = "SELECT * FROM compactdisc";
$ris_random_cd = mysql_query($query_random_cd,$db) or die("Errore nella query cd random: ".mysql_error());
$number=mysql_num_rows($ris_random_cd);
$rand_number = mt_rand (1,$number);
$numerello = random_cd_check($rand_number,$db);
echo "numero fortunello funzione random ".$numerello."\n";
return $numerello;
}
//
function random_cd_check($rand_number,$db){
$query_check_random_cd = "SELECT * FROM compactdisc WHERE compactdisc.id='$rand_number' AND compactdisc.attivo=TRUE";
$ris_check_random_cd = mysql_query($query_check_random_cd,$db) or die("Errore nella query check cd random: ".mysql_error());
$check_random_cd_total=mysql_num_rows($ris_check_random_cd);
if ($check_random_cd_total>=1){
echo "cd attivo!\n";
echo "numero fortunello funzione check ".$rand_number."\n";
return $rand_number;
}else{
echo "cd non attivo!\n";
random_call($db);
}
}
//
$numerello = random_call($db);
echo "numero fortunello ".$numerello."\n";
[/php]Dopo una serie di modifiche e tentativi, ho dedotto che il problema risieda in queste righe:[php]
$numerello = random_cd_check($rand_number,$db);
echo "numero fortunello funzione random ".$numerello."\n";
return $numerello;
[/php]Questo echo, infatti, non visualizza solo $numerello ricevuto dalla chiamata della funzione random_cd_check (quindi quello corrispondente al record attivo) bensì viene ripetuto per ogni query effettuata, anche quelle che hanno avuto esito negativo.Se prima del record attivo ne sono stati selezionati casualmente 12 non attivi, il comando echo verrà ripetuto 12 volte anche se solo la prima visualizzazione avrà un valore (ovvero quello ricevuto dalla funzione random_cd_check) poichè gli echo vengono visualizzati in ordine inverso.
Proprio per questo return $numerello non restituisce assolutamente nulla poichè darà l'esito della prima query (il cui esito, nei test che sto effettuando, è quasi sempre negativo poichè tra i record presenti solo uno è attivo, proprio per verificare l'efficienza del codice).Mi rendo conto di non aver esposto la faccenda nel più chiaro dei modi, mi auguro tuttavia qualcuno riesca a capirci qualcosa e sia in grado di darmi una mano.
Grazie e buona serata.
-
Ciao Eugene,
ma non puoi semplicemente fare la query che ti estragga una riga random, invece di fare tutte quelle operazioni?
-
No, perchè la riga random potrebbe corrispondere ad un record impostato su "non attivo" il cui contenuto non deve essere reso visibile.
Considera di avere una tabella contenente 100 CD. Tra questi ce ne sono 10 dai dati ancora incompleti o che, per ragioni che non è dato sapere, non si vogliono rendere visibili agli utenti del sito.
Effettuando una selezione random all'interno della tabella si corre il rischio di selezionare uno di questi CD non attivi, quindi si rende indispensabile effettuare un controllo.Probabilmente il codice che sto usando può essere snellito, ma l'operazione va comunque effettuata.
-
Anche sulla riga random puoi usare il where e prende solo gli inattivi, il problema non si pone.
-
SELECT * FROM compactdisc WHERE compactdisc.attivo=TRUE ORDER BY RAND()
Prova così. [..]
M.
-
Buongiorno.
Più che rispolverare SQL dovrei proprio studiarlo, visto che mi ci sto dedicando solo da qualche settimana.
Allora, il mio intento è il seguente: visualizzare, in un apposito box presente nella pagina html, un CD (record della tabella) selezionato casualmente tra quelli attivi esistenti.
Preciso che gli ID dei record sono tutti consecutivi.
Detto questo, porto come esempio la situazione che ho impostato per fare i test: nella tabella sono presenti 14 record e solamente uno è attivo.
Questa è una condizione inverosimile poichè è molto più probabile che si verifichi il contrario, ovvero 13 record attivo ed uno non attivo.
Tuttavia, per adesso ho impostato tutto così per verificare i risultati dei test.
Il valore che a me interessa per recuperare i dati del record selezionato è l'ID. Questo perchè esistono dei collegamenti con altre tabelle ed il riferimento rimane sempre l'ID del CD selezionato.
Se utilizzassi il codice indicato (SELECT * FROM compactdisc WHERE compactdisc.attivo=TRUE ORDER BY RAND() ) otterrei un risultato non attendibile, e spiego subito il perchè:
per come sono impostati adesso i record (13 non attivi, 1 attivo) otterrei come risultati della query "1", ma non è detto che il record attivo sia quella avente per ID "1", pertanto richiamerei molto probabilmente il record sbagliato (ovvero non attivo).
Altrimenti, e qui mi servirebbe nuovamente aiuto, si dovrebbe scegliere casualmente un ID solamente tra quelli attivi (e non il numero, inteso come totale, dei record attivi come avviane attualmente).
Quindi, per riportare brevemente quella che è la mia esigenza, ho bisogno di ottenere un ID casuale tra quelli dei record attivi.Detto questo ringrazio per l'aiuto.
-
Tutto risolto.
Con il codice:
[php]
function random_call($db){
$query_random_cd = "SELECT * FROM compactdisc WHERE compactdisc.attivo=TRUE ORDER BY rand()";
$ris_random_cd = mysql_query($query_random_cd,$db) or die("Errore nella query cd random: ".mysql_error());
$number = mysql_fetch_array($ris_random_cd);
echo "La casualità ha prodotto il seguente risultato: ".$number['id'];
$selected_number = $number['id'];
return $selected_number;
}
[/php]seleziono casualmente un record tra quelli attivi, dopodichè ne estraggo l'ID, che è il valore che a me serve. In questo modo funziona anche in caso di ID non consecutivi, meglio di quanto sperassi.Grazie mille per l'aiuto.
-
Non estrarre tutti i dati se te ne serve uno ben preciso.
E se ti serve una sola riga: dillo a MYSQL.SELECT id FROM compactdisc WHERE compactdisc.attivo=TRUE ORDER BY rand() LIMIT 1
[...]
M.
-
Non mi offendo assolutamente.
Grazie ancora per l'aiuto.