2 rand() podrejdaniq

7 отговора 230 прегледа
#1

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?

Отговор
в отговор на mo #2

Re: 2 rand() podrejdaniq

пробвай така:
select rand(), ID from table order by 1

Отговор
в отговор на mo #3

Re: 2 rand() podrejdaniq

Правилно ли разбирам че искаш с една заявка да върнеш разбъркани върпосите и съответно отговорите им разбъркани ?

...
Отговор
в отговор на mo #4

Re: 2 rand() podrejdaniq

SELECT .... ORDER BY RAND();

salle.online.bg/sig
Отговор
в отговор на salle #5

Само 2 уточнения ;)


1.това работи от 3.23.х нагоре (в 3.22.х не работи ;)
2.Нужни са 2 заявки, една за въпросите след което за всеки един въпрос по същия начин си теглиш и разбъркваш отговорите ;)

...

Редактирано от Цвeтaн Цвeтkoв на

Отговор
в отговор на Цвeтaн Цвeтkoв #6

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

Отговор
в отговор на mo #7

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
Отговор
в отговор на salle #8

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
Отговор