Вверх ↑
Этот топик читают: Гость
Ответов: 27
Рейтинг: 14
#1: 2009-06-11 20:00:28 ЛС | профиль | цитата
Ребят, нужен совет знающих людей. Вообщем хочу организовать систему тестирования на SQLite, с админкой для удобного пополнения вопросов.
Связи с этим вопрос:
допустим, имеется база данных "sqltest.db3" с таблицей "tests", а в ней несколько полей вроде "voprosi", "otveti", "varianti"
так вот, как сделать вывод данных вопросов ("voprosi") рандомными?

надеюсь на адекватный для новечка ответ ))
карма: 1

0
Ответов: 3851
Рейтинг: 159
#2: 2009-06-11 22:05:42 ЛС | профиль | цитата
Replikant писал(а):
как сделать вывод данных вопросов ("voprosi") рандомными?

а просто перемешать варианты, полученные по запросу из базы - не подходит?
карма: 0
начавший
0
Ответов: 16884
Рейтинг: 1239
#3: 2009-06-11 23:33:09 ЛС | профиль | цитата
Replikant,
Определяем верхнюю границу для компонента Random

Select max(rowid) from tests 
Запрос на вывод

Select voprosi From tests Where rowid=%1
где %1 - число сгенерированное компонентом Random
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:Replikant
Ответов: 27
Рейтинг: 14
#4: 2009-06-12 00:21:37 ЛС | профиль | цитата
Благодарю. особенно за оперативность ))
Если правильно понял, то то что нужно. Завтра обязательно попробую.
------------ Дoбавленo в 00.26:
Андрей. писал(а):

хотелось бы организовать это с наименьшим количеством запросов, так как в базе может быть большое количество вопросов. И, возможно, организую клиент-серверную часть. Тогда там такое уже не прокатит...
но идея не плохая, в случаи, если не внемлю совету Tad'a, то так и поступлю
карма: 1

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#5: 2009-06-12 01:20:13 ЛС | профиль | цитата
Да, кстати -- в MySQL есть функция RAND(), откуда запрос, к примеру, будет SELECT * FROM `a` ORDER BY RAND()

Млин, а вот в SQlite я такого не нашел
карма: 22

1
Голосовали:Replikant
Ответов: 3851
Рейтинг: 159
#6: 2009-06-12 09:36:27 ЛС | профиль | цитата
в данном случае имхо больше подойдёт не рандом, а шафл, посему функция mysql подлежит исследованию. А по поводу самого шафл - в публикаторе была схемка, да и на форуме улучшенный вариант как-то встречался..
карма: 0
начавший
0
Ответов: 16884
Рейтинг: 1239
#7: 2009-06-12 09:43:56 ЛС | профиль | цитата
Андрей. писал(а):
посему функция mysql подлежит исследованию
и без исследования все понятно.
nesco писал(а):
SELECT * FROM `a` ORDER BY RAND()
ORDER BY - сортировка по колонкам
ORDER BY 1 - отсортирует по id (если есть)
ORDER BY 2 - отсортирует по voprosi
ORDER BY 3 - отсортирует по otveti
ORDER BY 4 - отсортирует по varianti
Ну и какая это "систему тестирования " ?


карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:Replikant
Ответов: 3514
Рейтинг: 184
#8: 2009-06-12 10:04:08 ЛС | профиль | цитата
 SELECT string FROM strings   WHERE id >= (abs(random()) % (SELECT max(id) FROM strings))
LIMIT 1;
карма: 0
2
файлы: 1code_13682.txt [102B] [168]
Голосовали:Tad, Replikant
Разработчик
Ответов: 26151
Рейтинг: 2127
#9: 2009-06-12 13:39:34 ЛС | профиль | цитата
Tad писал(а):
Ну и какая это "систему тестирования " ?

там же написано "к примеру" использования функции в MySQL, а не к конкретному случаю. И использовался этот пример в источнике, именно для случайной выборки полей.

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

Астрамак, а откуда взята функция random, в описании к SQLIte нет этой агрегатной функции, ни в FAQ, ни в синтаксисе
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#10: 2009-06-12 14:22:17 ЛС | профиль | цитата
Core Functions
random() Return a pseudo-random integer between -9223372036854775808 and +9223372036854775807.

------------ Дoбавленo в 14.23:
nesco писал(а):
Tad, у меня складывается, уже неоднозначное, впечатление, что ты мы меня считаешь за полного барана, задавая вот такие пустые и каверзные вопросы, и постоянно хочешь меня на чем-то поймать
nesco, не считаю, но вопросов больше не будет.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#11: 2009-06-12 14:34:30 ЛС | профиль | цитата
Tad писал(а):
но вопросов больше не будет

Да я не против вопросов вообще, я против "таких" вопросов

А по теме: вот в чем недостаток нестандартных функций SQL -- в том, что тут кто во что горазд, у одних это -- rand(), у других -- random(). Вот почему я не сторонник писать запросы на нестандартных функциях -- невозможно их потом будет применить к другим базам

А насчет SQLite, тут да, я виноват , плохо искал
карма: 22

0
Ответов: 27
Рейтинг: 14
#12: 2009-06-12 16:10:29 ЛС | профиль | цитата
Еще раз спасибо всем за помощь. Столкнулся теперь вот с такой проблемой. Читал документацию, и натолкнулся вот на что:
>> 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

0
Ответов: 2125
Рейтинг: 159
#13: 2009-06-12 16:41:28 ЛС | профиль | цитата
У LIMIT есть второй параметр: смещение от начала. Но он не понимает выражения, ему нужна константа. Т.е. random нужно делать в программе, а не в SQL.

Например, использовать FormatStr с такой строкой:
SELECT string FROM strings LIMIT 1,%1

где %1 будет заменяться случайным числом от 0 до (select count(*) from strings)-1

карма: 1

0
Ответов: 16884
Рейтинг: 1239
#14: 2009-06-12 17:19:54 ЛС | профиль | цитата
Replikant писал(а):
программа может пытаться выдать уже не существующую строку.
Проверка - если пустышка опять на SELECT
Да и на повтор, наверное, проверять нужно.

Метод научного тыка показал, что словосочетание order by random() все ж таки перебирает строки, а не колонки,
( nesco, твоя строка запроса оказалась самой оптимальной Снимаю шляпу. )
поэтому

SELECT * FROM strings order by random() 
выведет все строки в "рандомном" порядке, а

SELECT * FROM strings order by random() LIMIT 1
выведет одну "рандомную" строку

------------ Дoбавленo в 10.47:
Да, Replikant, и не "пытается выдать несуществующую строку" - видно в order by random() есть своя проверка.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#15: 2009-06-14 12:31:06 ЛС | профиль | цитата
Tad писал(а):
твоя строка запроса оказалась самой оптимальной

Ну, положим, это не моя строка, а надыбанная на широких просторах тырнета, но рад, что она оказалась действенной. Хорошо бы в Wiki ее добавить, думаю, пригодится
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)