Нужно организовать вывод тестов из базы
В тесте по 25 вопросов
При увеличении числа вопроса, вопрос усложняется.
Я закидал вопросы в таблицу и присвоил номер каждому (1-25)
теперь мне нужно вытащить по порядку вопросы +случайные.
К примеру вытащи случайный 1 вопрос, потом 2, 3, 4......Тем самым сгенерировать новый вариант вопросов.
for($i=1; $i<26; $i++) {
$res = mysql_query("SELECT * FROM `test` WHERE `num`= '".$i."' ORDER BY RAND() LIMIT 1") or die(mysql_error());
$r = mysql_fetch_assoc($res);
?>
<p><?php echo $r['quest']; ?></p><br />
<input type="radio" name="ans<?php echo $i; ?>" value="a"/> A) <?php echo $r['a']; ?><br />
<input type="radio" name="ans<?php echo $i; ?>" value="b"/> B) <?php echo $r['b']; ?><br />
<input type="radio" name="ans<?php echo $i; ?>" value="c"/> C) <?php echo $r['c']; ?><br />
<input type="radio" name="ans<?php echo $i; ?>" value="d"/> D) <?php echo $r['d']; ?><br />
<input type="radio" name="ans<?php echo $i; ?>" value="e"/> E) <?php echo $r['e']; ?><br />
<?php
}
Мне кажется он тормознутый, загрузить сервер. Можно это еще как нибуть по другому организовать,если другой выход, альтернатива?
Спустя 43 минуты, 54 секунды (7.03.2011 - 20:07) Trianon написал(а):
какой смысл вытаскивать их по одному?
Спустя 11 часов, 41 минута, 58 секунд (8.03.2011 - 07:49) pak написал(а):
Цитата (Trianon @ 7.03.2011 - 17:07) |
какой смысл вытаскивать их по одному? |
Я мог бы вытащить 25 вопрос случайных и всё, но с каждым вопросом, вопрос усложняется и мне нада сначал случаный1 потом 2 3 4 5 ...25
Спустя 17 минут, 25 секунд (8.03.2011 - 08:06) inpost написал(а):
pak
Попробуй GROUP BY `num`
LIMIT 25
Должен будешь получить 25 случайных сгруппированных по номеру.
Попробуй GROUP BY `num`
LIMIT 25
Должен будешь получить 25 случайных сгруппированных по номеру.
Спустя 42 минуты, 39 секунд (8.03.2011 - 08:49) pak написал(а):
Цитата (inpost @ 8.03.2011 - 05:06) |
pak Попробуй GROUP BY `num` LIMIT 25 Должен будешь получить 25 случайных сгруппированных по номеру. |
Она групирует, но не генерирует их)
Спустя 3 минуты, 43 секунды (8.03.2011 - 08:53) Trianon написал(а):
Цитата (inpost @ 8.03.2011 - 08:06) |
pak Попробуй GROUP BY `num` LIMIT 25 Должен будешь получить 25 случайных сгруппированных по номеру. |
Может быть всё же ORDER BY ?
SELECT * ... GROUP BY ... это сюрр.
Спустя 5 минут, 28 секунд (8.03.2011 - 08:58) inpost написал(а):
Trianon
ORDER BY RAND()
GROUP BY `num`
LIMIT 25
не пробовал, но так разве не получится? Или группировка пройдет в таком случае ранее сортировки и их местами поменять??
ORDER BY RAND()
GROUP BY `num`
LIMIT 25
не пробовал, но так разве не получится? Или группировка пройдет в таком случае ранее сортировки и их местами поменять??
Спустя 4 минуты, 54 секунды (8.03.2011 - 09:03) pak написал(а):
Цитата (inpost @ 8.03.2011 - 05:58) |
Trianon ORDER BY RAND() GROUP BY `num` LIMIT 25 не пробовал, но так разве не получится? Или группировка пройдет в таком случае ранее сортировки и их местами поменять?? |
GROUP BY `num` ORDER BY RAND() LIMIT 25
Она теперь генерирует, но берет только первые 25 и их менят местами.
Спустя 10 минут, 27 секунд (8.03.2011 - 09:14) Trianon написал(а):
Цитата (inpost @ 8.03.2011 - 05:58) |
Trianon ORDER BY RAND() GROUP BY `num` LIMIT 25 не пробовал, но так разве не получится? Или группировка пройдет в таком случае ранее сортировки и их местами поменять?? |
Обычно GROUP BY пишут раньше ORDER BY.
В любом случае GROUP BY выполняется раньше ORDER BY.
Но... что она даст?
GROUP BY X означает, что в SQL-результате следует оставить лишь по одной строке на каждое значение X (и при этом в нормальных СУБД требуется, чтобы в SELECT-списке никакие другие поля кроме X в чистом виде не фигурировали - иначе возникнет неопределенность - "из какой именно строки (если их несколько с одним X) выбирать поле?". Другие поля можно использовать лишь в агрегатных функциях, вроде MIN(), SUM() и т.п.)
СУБД MySQL в стандартных настройках менее придирчива к смыслу, и позволяет такие поля указывать. Что она выберет в качестве значения для каждого из полей - непредсказуемо.
Если вернуться к вопросу топикстартера, то тут, конечно, всё становится еще более запутанным.
Мне, например, до сих пор неясно, что это за num, может ли он повторяться, и что вообще с ним делать. Но тут уж...
Спустя 4 минуты, 19 секунд (8.03.2011 - 09:18) Trianon написал(а):
pak
Я не очень себе представляю, какие данные хранятся в таблице,
кроме того не понял, что в ней означает num, и как это поле должно влиять на формирование последовательности вопросов.
Я не очень себе представляю, какие данные хранятся в таблице,
кроме того не понял, что в ней означает num, и как это поле должно влиять на формирование последовательности вопросов.
Спустя 7 минут, 11 секунд (8.03.2011 - 09:25) pak написал(а):
Цитата (Trianon @ 8.03.2011 - 06:18) |
pak Я не очень себе представляю, какие данные хранятся в таблице, кроме того не понял, что в ней означает num, и как это поле должно влиять на формирование последовательности вопросов. |
Спустя 12 минут, 14 секунд (8.03.2011 - 09:37) Evilsoul написал(а):
inpost
тебе правильно написал
тебе правильно написал
Цитата |
ORDER BY RAND() GROUP BY `num` LIMIT 25 |
только нужно запрос перед циклом поставить
$res = mysql_query("SELECT * FROM `test`
WHERE `num`= '".$i."'
ORDER BY RAND()
GROUP BY `num`
LIMIT 25") or die(mysql_error());
while($r = mysql_fetch_assoc($res))
{
?>
<p><?php echo $r['quest']; ?></p><br />
<input type="radio" name="ans<?php echo $i; ?>" value="a"/> A) <?php echo $r['a']; ?><br />
<input type="radio" name="ans<?php echo $i; ?>" value="b"/> B) <?php echo $r['b']; ?><br />
<input type="radio" name="ans<?php echo $i; ?>" value="c"/> C) <?php echo $r['c']; ?><br />
<input type="radio" name="ans<?php echo $i; ?>" value="d"/> D) <?php echo $r['d']; ?><br />
<input type="radio" name="ans<?php echo $i; ?>" value="e"/> E) <?php echo $r['e']; ?><br />
<?php
}
Спустя 1 минута, 47 секунд (8.03.2011 - 09:39) Evilsoul написал(а):
тфю, немного не так тебя понял, так тебе нужно два запроса... один для случайного варианта, один для порядка
Спустя 2 минуты, 59 секунд (8.03.2011 - 09:42) Trianon написал(а):
А по поводу num?
Спустя 3 минуты, 21 секунда (8.03.2011 - 09:45) Evilsoul написал(а):
А что такое нам?
Спустя 2 минуты, 45 секунд (8.03.2011 - 09:48) Evilsoul написал(а):
мне кажется тебе нужно иначе построить таблицу....
Спустя 19 минут, 59 секунд (8.03.2011 - 10:08) pak написал(а):
Цитата (Evilsoul @ 8.03.2011 - 06:45) |
А что такое нам? |
это число вопроса по сложнасти.
Спустя 15 минут, 23 секунды (8.03.2011 - 10:24) Evilsoul написал(а):
ну тогда два запроса, один порядковый по сложности другой рандом кроме тех что выбраны.
Спустя 31 минута, 13 секунд (8.03.2011 - 10:55) SOKOJI написал(а):
Самое простое решение, которое я тут вижу - каждый вопрос выводить отдельно на каждой странице. Т.е. ответил на 1 вопрос, запросил другой и т.д, как это делается на многих сервисах с тестами
Спустя 4 минуты, 45 секунд (8.03.2011 - 11:00) Trianon написал(а):
Цитата (pak @ 8.03.2011 - 10:08) | ||
это число вопроса по сложнасти. |
Тогда, как ни странно Ваш самый первый вариант - оптимальный.
Вот только, и вправду, стоит ли выводить все вопросы скопом на одну страницу?
Спустя 3 минуты, 29 секунд (8.03.2011 - 11:03) Evilsoul написал(а):
SOKOJI
Цитата |
Самое простое решение, которое я тут вижу - каждый вопрос выводить отдельно на каждой странице. Т.е. ответил на 1 вопрос, запросил другой и т.д, как это делается на многих сервисах с тестами |
очень сомневаюсь что так делается на многих сервисах... а если 50 вопросов, то 50 страниц с запросами?
Спустя 33 минуты, 1 секунда (8.03.2011 - 11:36) pak написал(а):
Цитата (Trianon @ 8.03.2011 - 08:00) | ||||
Тогда, как ни странно Ваш самый первый вариант - оптимальный. Вот только, и вправду, стоит ли выводить все вопросы скопом на одну страницу? |
Да можно по отдельности сделать, через гет.
Спустя 19 дней, 6 часов, 30 минут, 8 секунд (27.03.2011 - 17:06) pak написал(а):
Есть идеи?