2 rand() podrejdaniq
7 отговора
230 прегледа
2 rand() podrejdaniq
imam sledniq problem kogato se opitvam da napravq sistema za online testvane na php/mysql :
imam 2 tablici - vyprosi i otgovori . otnoshenieto m/u tqh e edno kym mnogo. kogato iskam da napravq otdelen test selectiram nujnite mi vyprosi i otgovori i gi otpechatvam.
testyt izglejda po podoben nachin
question1
answer1
answer2
answer3
question2
answer1
answer2
answer3
problemyt mi se krie v tova, che iskam poziciite na vyprosite i na otgovorite na vseki vypros da se promenqt pri vsqko izgotvqne na nov test, a ne da se pokazvat v posledivatelnosta na id-tata v bazata danni. t.e. nesto ot roda na:
question2
answer2
answer1
answer3
question1
answer2
answer3
answer1
sega tova go pravq kato izvajdam random poslednovatelnost na id-to na vyprosa i prastam odelna zaqvka (koqto otnovo se podrejda po rand() )za vsqka grupa otgovrori
bihte li mi dali ideq kak moga da go napravq po-dobre?
imam 2 tablici - vyprosi i otgovori . otnoshenieto m/u tqh e edno kym mnogo. kogato iskam da napravq otdelen test selectiram nujnite mi vyprosi i otgovori i gi otpechatvam.
testyt izglejda po podoben nachin
question1
answer1
answer2
answer3
question2
answer1
answer2
answer3
problemyt mi se krie v tova, che iskam poziciite na vyprosite i na otgovorite na vseki vypros da se promenqt pri vsqko izgotvqne na nov test, a ne da se pokazvat v posledivatelnosta na id-tata v bazata danni. t.e. nesto ot roda na:
question2
answer2
answer1
answer3
question1
answer2
answer3
answer1
sega tova go pravq kato izvajdam random poslednovatelnost na id-to na vyprosa i prastam odelna zaqvka (koqto otnovo se podrejda po rand() )za vsqka grupa otgovrori
bihte li mi dali ideq kak moga da go napravq po-dobre?
Re: 2 rand() podrejdaniq
Правилно ли разбирам че искаш с една заявка да върнеш разбъркани върпосите и съответно отговорите им разбъркани ?
...
...
Само 2 уточнения ;)
1.това работи от 3.23.х нагоре (в 3.22.х не работи ;)
2.Нужни са 2 заявки, една за въпросите след което за всеки един въпрос по същия начин си теглиш и разбъркваш отговорите ;)
...
Редактирано от Цвeтaн Цвeтkoв на
Re: Само 2 уточнения ;)
blagodarq za otgovorite
neka da se opitam da razbera kak razbrah syveta vi :
1. select id from questions where .. order by rand()
tozi razultat go syhranqvam v masiva $questions
i posle
2. for($i = 0 ; $i <count($questions) ; $i++){
select * from answers where question_id = $questions[$i] order by rand();
}
tova e nachina po koito go pravq i sega , no tochno toi mi se struva neefektiven
neka da se opitam da razbera kak razbrah syveta vi :
1. select id from questions where .. order by rand()
tozi razultat go syhranqvam v masiva $questions
i posle
2. for($i = 0 ; $i <count($questions) ; $i++){
select * from answers where question_id = $questions[$i] order by rand();
}
tova e nachina po koito go pravq i sega , no tochno toi mi se struva neefektiven
Re: Само 2 уточнения ;)
Значи имаш 2 таблици:
questions (id ...)
answers (id, question_id)
Да приемем че answers id = 1,2,3 (не знам дали ти е такава идеята)
ето едно примерче:
mysql> select * from q;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+------+
6 rows in set (0.00 sec)
mysql> select * from a;
+------+------+
| q_id | id |
+------+------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
| 4 | 1 |
| 4 | 2 |
| 4 | 3 |
| 5 | 1 |
| 5 | 2 |
| 5 | 3 |
| 6 | 1 |
| 6 | 2 |
| 6 | 3 |
+------+------+
mysql> select q.id as q, a.id as a from q,a where q.id=a.q_id order by q.id, rand();
+------+------+
| q | a |
+------+------+
| 1 | 2 |
| 1 | 1 |
| 1 | 3 |
| 2 | 2 |
| 2 | 3 |
| 2 | 1 |
| 3 | 2 |
| 3 | 3 |
| 3 | 1 |
| 4 | 1 |
| 4 | 3 |
| 4 | 2 |
| 5 | 2 |
| 5 | 1 |
| 5 | 3 |
| 6 | 3 |
| 6 | 2 |
| 6 | 1 |
+------+------+
18 rows in set (0.01 sec)
Въпросите все още са подредени, но отговорите са разбъркани.
Остава задачката и въпросите да са разбъркани - аз бих го направил с временна таблица:
mysql> create temporary table temp (i int auto_increment primary key) select q.id from q order by rand();
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from temp;
+---+------+
| i | id |
+---+------+
| 1 | 3 |
| 2 | 5 |
| 3 | 1 |
| 4 | 2 |
| 5 | 6 |
| 6 | 4 |
+---+------+
6 rows in set (0.00 sec)
mysql> select q.id as q, a.id as a from temp as q,a where q.id=a.q_id order by q.i, rand();
+------+------+
| q | a |
+------+------+
| 3 | 2 |
| 3 | 3 |
| 3 | 1 |
| 5 | 1 |
| 5 | 2 |
| 5 | 3 |
| 1 | 3 |
| 1 | 2 |
| 1 | 1 |
| 2 | 2 |
| 2 | 3 |
| 2 | 1 |
| 6 | 3 |
| 6 | 2 |
| 6 | 1 |
| 4 | 3 |
| 4 | 1 |
| 4 | 2 |
+------+------+
18 rows in set (0.00 sec)
Просто във временната таблица добавих едно auto_increment за да мога да сортирам по него
Пак не е само една заявка, но са само 2 - по добре отколкото N+1 където N е броя на въпросите.
в 4.1 това ще може да се направи със sub-select - това е от малкото примери когато наистина се изисква subselect
salle.online.bg/sig
questions (id ...)
answers (id, question_id)
Да приемем че answers id = 1,2,3 (не знам дали ти е такава идеята)
ето едно примерче:
mysql> select * from q;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+------+
6 rows in set (0.00 sec)
mysql> select * from a;
+------+------+
| q_id | id |
+------+------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
| 4 | 1 |
| 4 | 2 |
| 4 | 3 |
| 5 | 1 |
| 5 | 2 |
| 5 | 3 |
| 6 | 1 |
| 6 | 2 |
| 6 | 3 |
+------+------+
mysql> select q.id as q, a.id as a from q,a where q.id=a.q_id order by q.id, rand();
+------+------+
| q | a |
+------+------+
| 1 | 2 |
| 1 | 1 |
| 1 | 3 |
| 2 | 2 |
| 2 | 3 |
| 2 | 1 |
| 3 | 2 |
| 3 | 3 |
| 3 | 1 |
| 4 | 1 |
| 4 | 3 |
| 4 | 2 |
| 5 | 2 |
| 5 | 1 |
| 5 | 3 |
| 6 | 3 |
| 6 | 2 |
| 6 | 1 |
+------+------+
18 rows in set (0.01 sec)
Въпросите все още са подредени, но отговорите са разбъркани.
Остава задачката и въпросите да са разбъркани - аз бих го направил с временна таблица:
mysql> create temporary table temp (i int auto_increment primary key) select q.id from q order by rand();
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from temp;
+---+------+
| i | id |
+---+------+
| 1 | 3 |
| 2 | 5 |
| 3 | 1 |
| 4 | 2 |
| 5 | 6 |
| 6 | 4 |
+---+------+
6 rows in set (0.00 sec)
mysql> select q.id as q, a.id as a from temp as q,a where q.id=a.q_id order by q.i, rand();
+------+------+
| q | a |
+------+------+
| 3 | 2 |
| 3 | 3 |
| 3 | 1 |
| 5 | 1 |
| 5 | 2 |
| 5 | 3 |
| 1 | 3 |
| 1 | 2 |
| 1 | 1 |
| 2 | 2 |
| 2 | 3 |
| 2 | 1 |
| 6 | 3 |
| 6 | 2 |
| 6 | 1 |
| 4 | 3 |
| 4 | 1 |
| 4 | 2 |
+------+------+
18 rows in set (0.00 sec)
Просто във временната таблица добавих едно auto_increment за да мога да сортирам по него
Пак не е само една заявка, но са само 2 - по добре отколкото N+1 където N е броя на въпросите.
в 4.1 това ще може да се направи със sub-select - това е от малкото примери когато наистина се изисква subselect
salle.online.bg/sig
Re: Само 2 уточнения ;)
Забравих да кажа, че същоно може да се направи със нещо като:
mysql> select q_id, a.id from (select round(1000 * rand()) as r, q.id from q order by rand()) as q2, a where q2.id = a.q_id order by r, rand();
+------+------+
| q_id | id |
+------+------+
| 4 | 3 |
| 4 | 2 |
| 4 | 1 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
| 5 | 2 |
| 5 | 1 |
| 5 | 3 |
| 1 | 2 |
| 1 | 1 |
| 1 | 3 |
| 2 | 3 |
| 2 | 2 |
| 2 | 1 |
| 6 | 3 |
| 6 | 1 |
| 6 | 2 |
+------+------+
18 rows in set (0.00 sec)
mysql> select version();
+-----------------------+
| version() |
+-----------------------+
| 4.1.0-alpha-debug-log |
+-----------------------+
salle.online.bg/sig
mysql> select q_id, a.id from (select round(1000 * rand()) as r, q.id from q order by rand()) as q2, a where q2.id = a.q_id order by r, rand();
+------+------+
| q_id | id |
+------+------+
| 4 | 3 |
| 4 | 2 |
| 4 | 1 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
| 5 | 2 |
| 5 | 1 |
| 5 | 3 |
| 1 | 2 |
| 1 | 1 |
| 1 | 3 |
| 2 | 3 |
| 2 | 2 |
| 2 | 1 |
| 6 | 3 |
| 6 | 1 |
| 6 | 2 |
+------+------+
18 rows in set (0.00 sec)
mysql> select version();
+-----------------------+
| version() |
+-----------------------+
| 4.1.0-alpha-debug-log |
+-----------------------+
salle.online.bg/sig