Newsgroup: it.comp.www.php
Titolo: SELECT DISTINCT non mi funziona

SELECT DISTINCT non mi funziona 
--------------------------------------------------------------------------------
Salve ragazzi, sono un nuovo iscritto, avrei bisogno, se potete di un
piccolo aiuto su una query del mio database sql.
Sto facendo un sistema a quiz dove ho una domanda a cui sono associate 4
risposte.
Ho creato una tabella per le domande ed una per le risposte associando
domanda-risposte con un campo codice.
Ogni quiz ha 30 domande con ognuna quindi 4 risposte.
Nel fare la query al database ho impostato così:
$sql = "
SELECT
dom2mate.coddom,
dom2mate.txtdom,
risp2mate.codrisp,
risp2mate.txtrisp,
FROM
dom2mate,
risp2mate
WHERE
dom2mate.coddom = risp2mate.codrisp
";
$risultato = @mysql_query($sql,$connessione)
or die("Impossibile connettersi al database");
while ($riga = mysql_fetch_array($risultato)) {
$coddom = $riga['coddom'];
$codrisp = $riga['codrisp'];
$txtdom = $riga['txtdom'];
$txtrisp = $riga['txtrisp'];
// creo la stringa per la visualizzazione
$visualizza .= "
<tr>
<td>$txtdom</td>
</tr>
<tr>
<td>$txtrisp</td>
</tr>
";
}
?>
<table width="896" border="0" cellpadding="2" cellspacing="2"
bordercolor="#806B3C">
<tr>
<td height="106" valign="top" align="center"><img border="0"
src="immagini/banner.gif"></td>
</tr>
</table>
<table width="896" border="0" cellpadding="2" cellspacing="2"
bordercolor="#806B3C">
<tr><td><p class="titol" align="center">PROVA MATEMATICA CLASSE
SECONDA</p></td></tr>
</table>
<table width="896" border="0" cellpadding="2" cellspacing="2"
bordercolor="#806B3C">
<? echo "$visualizza"; ?> 
</table>
Funziona perfettamente, il problema è che mi ripete la domanda sempre
mentre io vorrei che la domanda venisse visualizzata una volta sola e le
risposte una sotto l'altra (che poi gli alunni sceglieranno). Ho provato
col DISTINCT ma non cambia nulla e col GROUP BY mi visualizza la domanda
con una sola risposta.
Qualcuno mi può aiutare?
grazie anticipatamente
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 }
Indendato correttamente: tu crei la stringa dentro il while per cui ti
ripete la domanda per forza. E con la query strutturata così non credo che
se ne possa andare fuori... Io farei una query che data la domanda ti
recupera le risposte. 
Una query recupera le domande e un'altra recupera le risposte per ogni
domanda, in quel modo per ogni domanda cicli le risposte. 
È un po' più pesante per il DB ma è la prima soluzione che mi è venuta in
mente, se ho capito correttamente il problema.
Altrimenti puoi risolvere così:
function mysql_fetch_all($query){
 $r=@mysql_query($query);
 if($err=mysql_errno())return $err;
 if(@mysql_num_rows($r))
  while($row=mysql_fetch_array($r))$result[]=$row;
 return $result;
}
fonte: 
http://php.net/manual/en/function.mysql-fetch-array.php
e poi ti smazzi l'array risultante :)
Ciao
KW

 KW
Hai ragione, grazie mille, a buon rendere, se capita :)


Qualcuno mi può aiutare?
Ordina le domande per domanda e risposta:
SELECT dom2mate.coddom, dom2mate.txtdom,
       risp2mate.codrisp, risp2mate.txtrisp,
	FROM
dom2mate JOIN risp2mate ON (dom2mate.coddom = risp2mate.codrisp)
ORDER BY coddom, codrisp;
A questo punto lui ti estrarra' i dati una domanda per volta, e tutte le
risposte consecutive:
DOMANDA1	RISPOSTA1
DOMANDA1	RISPOSTA2
DOMANDA1	RISPOSTA3
DOMANDA2	RISPOSTA1
DOMANDA2	RISPOSTA2
...
Che va benissimo. Ti rimane di risolvere il rendering:
$oldcod		= false;
$risposte	= array();
while ($riga = mysql_fetch_array($risultato))
{
	if ($oldcod !== $riga['coddom'])
	{
		// PRIMA OCCORRENZA di questa domanda.
		// C'era una domanda precedente che andava scritta?
		print rispoutput($oldcod, $txtdom, $risposte);
		$txtdom	= $riga['txtdom'];
		// Svuoto l'array risposte
		$risposte = array();
		// Mi preparo per non rientrare qui dentro finché non
cambierà di nuovo il codice domanda
		$oldcod = $riga['coddom'];
	}
	$codrisp	= $riga['codrisp'];
	$risposte[$codrisp] = $riga['txtrisp'];
}
// E ora facciamo uscire l'ultima domanda
print rispoutput($oldcod, $txtdom, $risposte);
La funzione che manda fuori le risposte:
function rispoutput($coddom, $txtdom, $risposte)
{
	if (empty($risposte))
		return '';
	$riga	= '';
	foreach($risposte as $codice => $testo)
		$riga .= <<<RISPOSTACICLO
<li><input type="radio" name="risposta[$oldcod]" value="$codice"
/>$testo</li>
RISPOSTACICLO;
	return '<tr><td>' . $txtdom . '</td>'
		. '<td><ul>' . $riga . '</ul></td>'
		. '</tr>';
}
Leonardo (SE&O)
-- 
The cock doth craw, the day doth daw,
the channerin' worm doth chide:
gin we be mist oot o' oor place,
a sair pain we maun bide.