как получить случайную строку из таблицы?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
MLT-Coder
Сообщения: 10
Зарегистрирован: 04 сен 2006, 12:44

как получить случайную строку из таблицы?

Сообщение MLT-Coder » 04 сен 2006, 16:39

в MySQL я это делал так

Код: Выделить всё

select * from qwe order by rand() limit 1
скачал расширение RandomUDF
все задекларировал, проверил

Код: Выделить всё

SELECT GetRandom(10) FROM MYTABLE - работает!
пытался сделать

Код: Выделить всё

select * from qwe order by GetRandom(1000) rows 1
выдает

Код: Выделить всё

Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, char 36
(
Statement: select * from qwe order by GetRandom(1000) rows 1
пытался так

Код: Выделить всё

select qwe.*, GetRandom(1000) as Rand from qwe order by Rand
тоже нифига

Код: Выделить всё

Dynamic SQL Error
SQL error code = -206
Column unknown
RAND
Statement: select qwe.*, GetRandom(1000) as Rand from qwe order by Rand
что делать?

MLT-Coder
Сообщения: 10
Зарегистрирован: 04 сен 2006, 12:44

Сообщение MLT-Coder » 04 сен 2006, 17:02

прочитал это
http://www.sql.ru/forum/actualthread.as ... &hl=random

может из-за того что у меня interbase 6.5 (довольно старая версия)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 сен 2006, 17:04

все очень просто.
сначала получаешь случайный номер в программе. потом делаешь select * from table where pk_field = :rnd

то, что ты пытаешься сделать - странно. В последнем запросе прочитай внимательнее сообщение об ошибке. Хотя я не знаю, что тебе даст
select *.qwe, getrandom(1000) from qwe

ну даст в последнем столбце случайные числа от 0 до 999, и что?

Ну и наконец,
select *.qwe, getrandom(1000) from qwe
order by getrandom(1000)
будет работать не во всех серверах IB/FB.

проще и гарантировано:
select getrandom(1000), *.qwe from qwe
order by 1

MLT-Coder
Сообщения: 10
Зарегистрирован: 04 сен 2006, 12:44

Сообщение MLT-Coder » 04 сен 2006, 17:27

получилось
select getrandom(1000), qwe.* from qwe order by 1 rows 1

ток меня это не устраивает =(

если бы можно было так
select getrandom(1000), * from qwe order by 1 rows 1

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 сен 2006, 17:48

получилась фигня, в общем-то. потому что раз данные getrandom не хранятся, сервер должен будет отсортировать не только getrandom в памяти (или на диске), но и *.qwe. Если табличка под несколько десятков или сотен записей, то тормозить будет преизрядно.

насчет "не устраивает *.qwe" я не понял. Вообще-то это вроде как стандарт, а с другой стороны, select * в реальных приложениях не пишут... я не учу, я констатирую.

Ответить