prendere 2 risultati casuali da database

loreberti10

Utente Attivo
22 Set 2012
43
0
0
ciao a tutti, ho un piccolo problema, supponete di avere come risultato di una query una cosa di questo tipo

Codice:
id_test Domanda sezione brano SottoSezione
1             2             1                 Geografia
id_test Domanda sezione brano SottoSezione
2             2             1                 Geografia
id_test Domanda sezione brano SottoSezione
3             2             1                 Geografia
id_test Domanda sezione brano SottoSezione
4             2             1                Letteratura
id_test Domanda sezione brano SottoSezione
5             2             1                 Letteratura
id_test Domanda sezione brano SottoSezione
6             2             1                Letteratura
id_test Domanda sezione brano SottoSezione
7             2             1                 Letteratura
id_test Domanda sezione brano SottoSezione
8             2             1                Letteratura
Ora quello che io vorrei cercare di fare è avere tramite Sql e PHP un risultato con un random degli id test ma che mi prenda solo 2 sottosezioni di ognuna.
Cioè ad esempio :
Codice:
id_test Domanda sezione brano SottoSezione
1             2             1                 Geografia
id_test Domanda sezione brano SottoSezione
3             2             1                 Geografia
id_test Domanda sezione brano SottoSezione
6             2             1                Letteratura
id_test Domanda sezione brano SottoSezione
8             2             1                Letteratura

è possibile farlo? cioè alla fine il gioco sarebbe solo rendere gli id test random ma prenderne solo 2 per ogni sottosezione..
 
Ultima modifica:
ciao
il problema sarebbe abbastanza semplice se tu fossi sicuro che gli id siano SEMPRE in sequenza, ma se es. cancelli un record l'id manca.
per cui per estrarre casualmente degli id devi priva vedere quali id esistono
PHP:
<?php
//dati di connessione
$id_casuali=array();
$q_1=mysql_query("SELECT sottocategoria FROM tabella GROUP BY sottocategoria ORDER BY sottocategoria");
while($r_1=mysql_fetch_array($q_1)){
	$sotto=$r_1['sottocategoria'];
	$q_2=mysql_query("SELECT id FROM tabella WHERE sottocategoria='$sotto'");
	while($r_2=mysql_fetch_array($q_2)){//estraggo gli id appartenenti alla sottocategoria
		$id_casuali[$sotto][]=$r_2['id'];//creo un array di array che poi randomizzerò
	}
}
foreach($id_casuali as $chiave => $valore){
	shuffle($id_casuali[$chiave]);//randomizzo gli id della categoria
	for($k=0; $k <= 1; $k++){//e estraggo i primi due che sono casuali
		$q_3=mysql_query("SELECT * FROM tabella WHERE id=".$id_casuali[$chiave][$k]);
		if($q_3){//trovato
			$r_3=mysql_fetch_array($q_3);
			echo "id ".$r_3['id']." - domanda ".$r_3['domanda']." brano ".$r_3['brano']." sotto categoria ".$r_3['sottocategoria']."<br>";
		}else{
			echo "non ci sono record<br>";
		}
	}
}
?>
prova, al massimo non funziona
p.s.
guarda che ho messo nome tabella e dei campi a caso, devi metterci i tuoi
 
Grazie della risposta, in realtà la mia situazione è leggermente più complicata,
In pratica io ho le domande suddivise in sezioni e sottosezioni e mi vengono poste una alla volta.
ora io quello che ad esempio ho fatto sotto è prendere i test della sezione 2, solo che io devo prendere esclusivamente i test che un utente non ha fatto, i test sono ordinati in ogni sezione.
ogni sezione è identificata da un intero, io quello che vorrei fare è dare dei tag a delle domande in maniera che vengano presi due record per sottosezioni, di una sezione particolare che in questo caso è la numero 2

Codice:
if ($database==FALSE) {
      echo "Errore nella connessione al DB: " . mysql_error();
   } else {
	
	$nick = $_SESSION['nome'];
	
	
		
$queryControllo = 
		("
		SELECT id_test, Test_Question, Sezione  
		FROM Admin
		WHERE Admin.Sezione = '2'
		
		EXCEPT
		
		SELECT id_test, Test_Question, Sezione
		FROM Admin JOIN RispostaUtente
		WHERE id_test = id_testUtente AND RispostaUtente.NickNameRisposta = '".$nick."' AND SezioneRisposte = '2'
		
		
		
		order by id_test ASC
	

		
		");
		$risultatoControllo=sqlite_query($database,$queryControllo);
$x=0;	
 	$contenutiControllo=sqlite_fetch_array($risultatoControllo);
 $idTest = $contenutiControllo['id_test'];
 $Question = $contenutiControllo['Test_Question'];
 $Sezione = $contenutiControllo['Sezione'];

quello che dovrei fare se riesco è prendere 2 domande per sottosezione, cioè forse per come ho fatto io non è possibile..ammetto che non sono stato proprio un genio nel fare questa funzione, ma era l'unico modo che mi era venuto in mente,
in poche parole dovrei cercare di modificare qeusto codice in maniera che mi prenda 2 record per ogni sotto sezione, secondo te è possibile?!
p.s alla fine non ho incollato le parentesi graffe perché il mio pezzo di codice è leggermente più lungo..
 
Beh, visto che lo avevo preparato lo posto cmq
in mysql esiste la funzione RAND()
e avevo pensato a qualcosa del genere
PHP:
<?php
include 'connessione.php';
$q = "SELECT SottoSezione FROM dati GROUP BY SottoSezione";
$res = mysql_query($q);

$array = array();
while ($row = mysql_fetch_array($res)) {
    $query = "SELECT * FROM dati WHERE SottoSezione = '" . $row['SottoSezione'] . "' ORDER BY RAND() LIMIT 2";
    $result = mysql_query($query);
    while ($r = mysql_fetch_array($result)) {
        $array[] = $r;
    }
}
// per estrarre i dati
echo "<table border='1'>";
echo "<tr>";
echo "<td>Id</td>";
echo "<td>Sezione</td>";
echo "</tr>";
foreach ($array as $value) {
    echo "<tr>";
    echo "<td>" . $value['id'] . "</td>";
    echo "<td>" . $value['SottoSezione'] . "</td>";
    echo "</tr>";
}
echo "</table>";
?>
ma se avevo capito a mala pena la tua prima domanda con i dettagli della seconda mi sono perso
 
ma se avevo capito a mala pena la tua prima domanda con i dettagli della seconda mi sono perso

Cerco di spiegare, allora nel database sono inserite più domande. Una domanda ha un Id, appartiene ad una sezione ed a una sottosezione.
Facendo un esempio e contando che la domanda sia ad esempio di geografia:
Id_test 1 , Domanda , Sezione 1, Sottocategoria Geografia.
Ora supponete che io ho più sottocategorie.
Cioè tanti record con id_test , domanda, sezione, sottocategoria

Quello che devo fare è
1)porre all'utente una domanda.
2)Le domande però dovrebbero essere uniche per quell'utente, cioè l'utente deve rispondere una sola volta ad una domanda.
3) Le domande vorrei che venissero poste random, ma vorrei che venissero poste 2 domande per sottocategoria cioè ad esempio:
Anche se ho 100 domande con diverse sottocategorie, vorrei che venissero poste all'utente solamente 2 domande di geografia, 2 di Letteratura, 2 di Storia ecc..

Il codice che ho pubblicato prima è semplicemente il codice che avevo fatto in maniera che all'utente venga presentato una domanda di una cerca Sezione e che quella domanda non sia mai stata fatta a quell'utente..

Sono stato un po più chiaro?
 
allora cerco alla fine di renderlo il più facile possibile fate conto che io ho una tabella fatta in questa maniera:

[table="width: 500"]
[tr]
[td]Id_test[/td]
[td]Domanda[/td]
[td]Sezione[/td]
[td]Brano[/td]
[td]SottoSezione[/td]
[/tr]
[tr]
[td]1[/td]
[td]una domanda[/td]
[td]1[/td]
[td]1[/td]
[td]Geografia[/td]
[/tr]
[tr]
[td]2[/td]
[td]una domanda[/td]
[td]1[/td]
[td]1[/td]
[td]Geografia[/td]
[/tr]
[tr]
[td]3[/td]
[td]una domanda[/td]
[td]1[/td]
[td]1[/td]
[td]Geografia[/td]
[/tr]
[tr]
[td]4[/td]
[td]una domanda[/td]
[td]1[/td]
[td]1[/td]
[td]Storia[/td]
[/tr]
[tr]
[td]5[/td]
[td]una domanda[/td]
[td]1[/td]
[td]1[/td]
[td]Storia[/td]
[/tr]
[tr]
[td]6[/td]
[td]una domanda[/td]
[td]1[/td]
[td]1[/td]
[td]Storia[/td]
[/tr]

[/table]

Quello che vorre che la mia query facesse è restituire solamete 2 test a caso per ogni sotto sezione. cioè 2 test di storia e 2 test di geografia casualmente.
Fate conto che però io non dovrei sapere quali sotto sezioni ci sono ne quante..
 
Quello che vorre che la mia query facesse è restituire solamete 2 test a caso per ogni sotto sezione. cioè 2 test di storia e 2 test di geografia casualmente.
il codice che ti ho postato io fa proprio questo
 
Ciao mi funziona, solo che ora ho il problema dell'invio del form, cioè li ho tanti form con tanti submit, potrei in qualche maniera inviare con un solo submit o pulsante tutti i valori presi dai form??
 
ciao
ricorda questo principio: "un problema => un post"

Grazie, penso di aver capito che non è possibile... :/
E se invece riuscissi a mettere tutte le domande in un unico form potrei inviare tutti i dati con il submit, ma poi come potrei gestire l'invio dei dati? scusate se vi rompo ma è una cosa che devo fare in tempi brevi... :/
 

Discussioni simili