View Full Version : [mysql] - ordinamento casuale record ma condizionato
john_revelator
06-12-2009, 22:28
Buona sera a tutti. Mi sono imbattuto in un problema con mysql e quindi mi ritrovo a chiedere un vostro consiglio.
Ho creato una tabellina che mi serve per la generazione di un questionario che vorrei avesse sia le domande che le risposte in ordine casuale.
id_risposta id_domanda
1 1
2 1
3 1
4 1
5 2
6 2
7 2
8 2
9 3
10 3
In pratica vorrei mischiare sia l'ordine delle domande che quello delle risposte.
Per mischiare l'ordine delle risposte ho risolto così
select *
from risposte
order by id_domanda,rand(),id_risposta
Ma solo con l'impiego di mysql non riesco a mischiare anche l'ordine delle domande.
Diciamo che ho risolto il problema appoggiandomi al php.
Esempio:
select *
from risposte
order by field(id_domanda,3,1,2),rand(),id_risposta
dove l'order by field() in php è diventato dinamico tramite l'utilizzo di un array con tutti gli id sul quale ho applicato la funzione shuffle() e poi l'implode() per la creazione della stringa ma per curiosità mia personale vorrei sapere se il problema è risolvibile col solo impiego di mysql. Ciao e grazie. :)
john_revelator
07-12-2009, 00:04
Visto che ci sono ne approfitto anche per fare un'altra domanda.
Per maggiore chiarezza posto un dump di esempio.
CREATE TABLE `risposte2` (
`id_risposta` int(11) NOT NULL auto_increment,
`id_domanda` int(11) default NULL,
`risposta` varchar(255) default NULL,
`corretta` tinyint(4) default NULL,
`answer` tinyint(4) default NULL,
PRIMARY KEY (`id_risposta`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;
/*Data for the table `risposte2` */
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (1,1,'aaaa',1,1);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (2,1,'bbbb',0,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (3,1,'cccc',0,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (4,1,'dddd',0,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (5,2,'eeee',1,1);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (6,2,'ffff',0,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (7,2,'gggg',0,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (8,2,'hhhh',1,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (9,3,'iiii',1,1);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (10,3,'llll',0,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (11,3,'mmmm',0,0);
Come vedete una domanda può anche avere più risposte valide.
Devo ovviamente verificare il risultato di tale questionario.
Io ho scritto la seguente query che funziona
select id_domanda,if(group_concat(corretta) = group_concat(answer),'corretta','sbagliata') as esito
from risposte2
group by id_domanda
però la soluzione non mi piace per niente perchè faccio ricorso alla funzione group_concat() di mysql che non è sql standard. Mi potete consigliare una soluzione più "portabile"? Grazie ancora.;)
così?
order by rand(),id_domanda,id_risposta
john_revelator
07-12-2009, 10:22
così?
order by rand(),id_domanda,id_risposta
E' la prima cosa che avevo provato. :D
Purtroppo non funziona, nel senso che l'ordinamento avviene in maniera del tutto casuale, mentre a me servirebbe che venissero messi prima tutti gli id_domanda 3, poi 1, poi 2 ad esempio. :doh:
e con un "GROUP BY id_domanda" come hai fatto nel secondo caso?
john_revelator
07-12-2009, 10:59
e con un "GROUP BY id_domanda" come hai fatto nel secondo caso?
Non posso usare la clausola group by perchè ovviamente mi verrebbe restituito un record per ciascuna domanda e perderei le possibili risposte a ciascuna di essa. :)
john_revelator
07-12-2009, 12:25
Visto che ci sono ne approfitto anche per fare un'altra domanda.
Per maggiore chiarezza posto un dump di esempio.
CREATE TABLE `risposte2` (
`id_risposta` int(11) NOT NULL auto_increment,
`id_domanda` int(11) default NULL,
`risposta` varchar(255) default NULL,
`corretta` tinyint(4) default NULL,
`answer` tinyint(4) default NULL,
PRIMARY KEY (`id_risposta`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;
/*Data for the table `risposte2` */
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (1,1,'aaaa',1,1);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (2,1,'bbbb',0,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (3,1,'cccc',0,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (4,1,'dddd',0,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (5,2,'eeee',1,1);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (6,2,'ffff',0,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (7,2,'gggg',0,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (8,2,'hhhh',1,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (9,3,'iiii',1,1);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (10,3,'llll',0,0);
insert into `risposte2` (`id_risposta`,`id_domanda`,`risposta`,`corretta`,`answer`) values (11,3,'mmmm',0,0);
Come vedete una domanda può anche avere più risposte valide.
Devo ovviamente verificare il risultato di tale questionario.
Io ho scritto la seguente query che funziona
select id_domanda,if(group_concat(corretta) = group_concat(answer),'corretta','sbagliata') as esito
from risposte2
group by id_domanda
però la soluzione non mi piace per niente perchè faccio ricorso alla funzione group_concat() di mysql che non è sql standard. Mi potete consigliare una soluzione più "portabile"? Grazie ancora.;)
Mi rispondo da solo. Con questa query sono in grado di trovare tutte le domande a cui è stata data una risposta errata.
select distinct r.id_domanda
from risposte2 as r
left join risposte2 as r2
on r.id_risposta = r2.id_risposta
where r.corretta <> r.answer
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.