[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Случайная выборка
pak
Добрый день,
Нужно организовать вывод тестов из базы
В тесте по 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 случайных сгруппированных по номеру.

Спустя 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 ? smile.gif

SELECT * ... GROUP BY ... это сюрр.

Спустя 5 минут, 28 секунд (8.03.2011 - 08:58) inpost написал(а):
Trianon
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, и как это поле должно влиять на формирование последовательности вопросов.

Спустя 7 минут, 11 секунд (8.03.2011 - 09:25) pak написал(а):
Цитата (Trianon @ 8.03.2011 - 06:18)
pak

Я не очень себе представляю, какие данные хранятся в таблице,
кроме того не понял, что в ней означает num, и как это поле должно влиять на формирование последовательности вопросов.

user posted image

Спустя 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 вопрос, запросил другой и т.д, как это делается на многих сервисах с тестами smile.gif

Спустя 4 минуты, 45 секунд (8.03.2011 - 11:00) Trianon написал(а):
Цитата (pak @ 8.03.2011 - 10:08)
Цитата (Evilsoul @ 8.03.2011 - 06:45)
А что такое нам?

это число вопроса по сложнасти.

Тогда, как ни странно Ваш самый первый вариант - оптимальный.
Вот только, и вправду, стоит ли выводить все вопросы скопом на одну страницу?

Спустя 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)
Цитата (pak @ 8.03.2011 - 10:08)
Цитата (Evilsoul @ 8.03.2011 - 06:45)
А что такое нам?

это число вопроса по сложнасти.

Тогда, как ни странно Ваш самый первый вариант - оптимальный.
Вот только, и вправду, стоит ли выводить все вопросы скопом на одну страницу?

Да можно по отдельности сделать, через гет.

Спустя 19 дней, 6 часов, 30 минут, 8 секунд (27.03.2011 - 17:06) pak написал(а):
Есть идеи?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.