Ребят, нужен совет знающих людей. Вообщем хочу организовать систему тестирования на SQLite, с админкой для удобного пополнения вопросов.
Связи с этим вопрос:
допустим, имеется база данных "sqltest.db3" с таблицей "tests", а в ней несколько полей вроде "voprosi", "otveti", "varianti"
так вот, как сделать вывод данных вопросов ("voprosi") рандомными?
надеюсь на адекватный для новечка ответ ))
Этот топик читают: Гость
Ответов: 27
Рейтинг: 14
|
|||
карма: 1 |
|
Ответов: 3851
Рейтинг: 159
|
|||
Replikant писал(а): как сделать вывод данных вопросов ("voprosi") рандомными?а просто перемешать варианты, полученные по запросу из базы - не подходит? |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Replikant,
Определяем верхнюю границу для компонента Random
|
|||
карма: 25 |
| ||
Голосовали: | Replikant |
Ответов: 27
Рейтинг: 14
|
|||
Благодарю. особенно за оперативность ))
Если правильно понял, то то что нужно. Завтра обязательно попробую. ------------ Дoбавленo в 00.26: Андрей. писал(а): хотелось бы организовать это с наименьшим количеством запросов, так как в базе может быть большое количество вопросов. И, возможно, организую клиент-серверную часть. Тогда там такое уже не прокатит... но идея не плохая, в случаи, если не внемлю совету Tad'a, то так и поступлю |
|||
карма: 1 |
|
Разработчик
Ответов: 26151
Рейтинг: 2127
|
|||
Да, кстати -- в MySQL есть функция RAND(), откуда запрос, к примеру, будет SELECT * FROM `a` ORDER BY RAND()
Млин, а вот в SQlite я такого не нашел |
|||
карма: 22 |
| ||
Голосовали: | Replikant |
Ответов: 3851
Рейтинг: 159
|
|||
в данном случае имхо больше подойдёт не рандом, а шафл, посему функция mysql подлежит исследованию. А по поводу самого шафл - в публикаторе была схемка, да и на форуме улучшенный вариант как-то встречался..
|
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Андрей. писал(а): посему функция mysql подлежит исследованиюnesco писал(а): SELECT * FROM `a` ORDER BY RAND()ORDER BY 1 - отсортирует по id (если есть) ORDER BY 2 - отсортирует по voprosi ORDER BY 3 - отсортирует по otveti ORDER BY 4 - отсортирует по varianti Ну и какая это "систему тестирования " ? |
|||
карма: 25 |
| ||
Голосовали: | Replikant |
Ответов: 3514
Рейтинг: 184
|
|||
|
|||
карма: 0 |
| ||
файлы: 1 | code_13682.txt [102B] [168] | ||
Голосовали: | Tad, Replikant |
Разработчик
Ответов: 26151
Рейтинг: 2127
|
|||
Tad писал(а): Ну и какая это "систему тестирования " ?там же написано "к примеру" использования функции в MySQL, а не к конкретному случаю. И использовался этот пример в источнике, именно для случайной выборки полей. Tad, у меня складывается, уже неоднозначное, впечатление, что ты мы меня считаешь за полного барана, задавая вот такие пустые и каверзные вопросы, и постоянно хочешь меня на чем-то поймать Астрамак, а откуда взята функция random, в описании к SQLIte нет этой агрегатной функции, ни в FAQ, ни в синтаксисе |
|||
карма: 22 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Core Functions
random() Return a pseudo-random integer between -9223372036854775808 and +9223372036854775807. ------------ Дoбавленo в 14.23: nesco писал(а): Tad, у меня складывается, уже неоднозначное, впечатление, что ты мы меня считаешь за полного барана, задавая вот такие пустые и каверзные вопросы, и постоянно хочешь меня на чем-то поймать |
|||
карма: 25 |
|
Разработчик
Ответов: 26151
Рейтинг: 2127
|
|||
Tad писал(а): но вопросов больше не будетДа я не против вопросов вообще, я против "таких" вопросов А по теме: вот в чем недостаток нестандартных функций SQL -- в том, что тут кто во что горазд, у одних это -- rand(), у других -- random(). Вот почему я не сторонник писать запросы на нестандартных функциях -- невозможно их потом будет применить к другим базам А насчет SQLite, тут да, я виноват , плохо искал |
|||
карма: 22 |
|
Ответов: 27
Рейтинг: 14
|
|||
Еще раз спасибо всем за помощь. Столкнулся теперь вот с такой проблемой. Читал документацию, и натолкнулся вот на что:
>> http://www.sqlite.org/autoinc.html ...The normal ROWID selection algorithm described above will generate monotonically increasing unique ROWIDs as long as you never use the maximum ROWID value and you never delete the entry in the table with the largest ROWID. If you ever delete rows or if you ever create a row with the maximum possible ROWID, then ROWIDs from previously deleted rows might be reused when creating new rows and newly created ROWIDs might not be in strictly accending order... то есть, если в таблице я удалял строки, а потом добавлял новые, то у них ROWID увеличивается. (а старый ROWID уже не используется.) тогда используя: SELECT string FROM strings WHERE id >= (abs(random()) % (SELECT max(id) FROM strings)) LIMIT 1; или -------- select max(rowid) from orders select onum from orders where rowid=%1 программа может пытаться выдать уже не существующую строку. (экспериментально подтверждено) тогда вопрос: а нет ли команды "переназначения" ROWID для каждых строк, чтобы исключить такую ситуацию? (кстати, а как страницы форума сохранять? а то через forum_serv.php без форматирования, не удобно) |
|||
карма: 1 |
|
Ответов: 2125
Рейтинг: 159
|
|||
У LIMIT есть второй параметр: смещение от начала. Но он не понимает выражения, ему нужна константа. Т.е. random нужно делать в программе, а не в SQL.
Например, использовать FormatStr с такой строкой: SELECT string FROM strings LIMIT 1,%1 где %1 будет заменяться случайным числом от 0 до (select count(*) from strings)-1 |
|||
карма: 1 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Replikant писал(а): программа может пытаться выдать уже не существующую строку.Да и на повтор, наверное, проверять нужно. Метод научного тыка показал, что словосочетание order by random() все ж таки перебирает строки, а не колонки, ( nesco, твоя строка запроса оказалась самой оптимальной Снимаю шляпу. ) поэтому
------------ Дoбавленo в 10.47: Да, Replikant, и не "пытается выдать несуществующую строку" - видно в order by random() есть своя проверка. |
|||
карма: 25 |
|
Разработчик
Ответов: 26151
Рейтинг: 2127
|
|||
Tad писал(а): твоя строка запроса оказалась самой оптимальнойНу, положим, это не моя строка, а надыбанная на широких просторах тырнета, но рад, что она оказалась действенной. Хорошо бы в Wiki ее добавить, думаю, пригодится |
|||
карма: 22 |
|