ФорумРазработкаБазы данных → Случайная выборка

Случайная выборка

  • pak

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 21 марта 2011 г. 11:55

    Добрый день,
    Нужно организовать вывод тестов из базы
    В тесте по 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
    }


    Мне кажется он тормознутый. Можно как нибуть по другому организовать,если другой выход, альтернатива?
  • phpdude

    Сообщения: 26632 Репутация: N Группа: в ухо

    Spritz 21 марта 2011 г. 12:03, спустя 7 минут 46 секунд

    сколько всего строк в этой таблице?
    Сапожник без сапог
  • pak

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 21 марта 2011 г. 12:09, спустя 6 минут 23 секунды

    по идеи больше 5000.
  • phpdude

    Сообщения: 26632 Репутация: N Группа: в ухо

    Spritz 21 марта 2011 г. 12:13, спустя 4 минуты 6 секунд

    ну я подозреваю что у тебя получается время выполнения примерно 0.4 секунды на эту выборку? на среднем сервере. на быстром будет где нить.

    дело в том, что возможно у тебя order by rand() создает файлы на жестком диске, а это не быстро, особенно для 25 файлов :-)

    я угадал с временами?
    Сапожник без сапог
  • pak

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 21 марта 2011 г. 12:18, спустя 5 минут 6 секунд

    Наверно, просто у меня только наброски, в базе примеры.
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 21 марта 2011 г. 12:24, спустя 5 минут 50 секунд

    увеличь значения сортировочного кеша
  • phpdude

    Сообщения: 26632 Репутация: N Группа: в ухо

    Spritz 21 марта 2011 г. 12:50, спустя 25 минут 39 секунд


    select test.* from test inner join (select distinct num, id from test order by rand()) `t` using(`id`) order by `num`
    думаю чтото такое должно тебя устроить)) такой запрос должен вернуть 25 уникальных строк для 25 вариантов num достточно быстро, но это надо пробовать, мне лень и не на чем :)

    чиатть такой запрос


    $q = mysql_query($sq);
    while($r = mysql_fetch_assoc($q))
    {
    …. ////
    }

    где $sql - этот запрос соответственно
    Спустя 50 сек.
    USING(`id`)

    это уникальное PRIMARY KEY поле id, если его у тебя нет, то его надо создать %)
    Сапожник без сапог
  • pak

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 22 марта 2011 г. 11:06, спустя 22 часа 16 минут 31 секунду



    select test.* from test inner join (select distinct num, id from test order by rand()) `t` using(`id`) order by `num`
    думаю чтото такое должно тебя устроить)) такой запрос должен вернуть 25 уникальных строк для 25 вариантов num достточно быстро, но это надо пробовать, мне лень и не на чем :)

    Он вытаскивает все записи, где num 1 и генерирования их показывая, и так 2 ,3…………..
  • phpdude

    Сообщения: 26632 Репутация: N Группа: в ухо

    Spritz 22 марта 2011 г. 11:17, спустя 10 минут 9 секунд

    Он вытаскивает все записи, где num 1 и генерирования их показывая, и так 2 ,3…………..

    задача решена? это и надо было? я так понял что тебе нужен был список вопросов разной сложности, по одному вопросу на уровен сложности, вроде так запрос должен работать
    Сапожник без сапог
  • pak

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 22 марта 2011 г. 11:22, спустя 5 минут 45 секунд


    Он вытаскивает все записи, где num 1 и генерирования их показывая, и так 2 ,3…………..

    задача решена? это и надо было? я так понял что тебе нужен был список вопросов разной сложности, по одному вопросу на уровен сложности, вроде так запрос должен работать

    не почти, мне нада выташить сгенерированный один вопрос где num 1 ? потом 2,3…………..
    а он перемешивает все записи где num 1 и вытаскивает всё, потом 2,3……………
    иными слова вытаскивает всю базу))

Пожалуйста, авторизуйтесь, чтобы написать комментарий!