Выбрать одну случайную строку

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

Ответить
fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

Выбрать одну случайную строку

Сообщение fmcoder » 05 ноя 2007, 22:16

Задача проста - выбрать одну случайную строку из таблицы.
В таблице нет PK, поэтому просто сделать в программе random id не получится.
Также, не хотелось бы использовать udf.
Вроде, такое должно как-то решаться средствами сервера... Но что-то я не нашел.
Помогите, пожалуйста.

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

Сообщение kdv » 05 ноя 2007, 23:05

нету в множествах такого понятия как "случайная строка". тем более если запись нечем идентифицировать.
Также, не хотелось бы использовать udf.
интересно, каким же это образом не имея ПК можно выбрать "случайную" запись при помощи UDF?

могу сгенерить тебе случайную дату и случайное слово. По ним выбери что-нибудь из БД:
'10.11.1999'
"пардон"

fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

Сообщение fmcoder » 05 ноя 2007, 23:55

Ну как везде пишут (в темах, посвященных этому вопросу):

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

select ... order by rand()
Т.е записи отсортируются по случайному значению... Вроде как это то что надо, но очень хочется обойтись без UDF.

Еще, я так понимаю, чтобы ограничить кол-во возвращаемых записей, нужно использовать first(1)?

UPD Да, еще забыл сказать: таблица состоит из одного поля (FK), т.е. значения там уникальные, но никакого порядка нет. Нужно взять одно из них.

Можно конечно тупо прочитать все значения в массив, и уже в программе выбрать одно, но мне такой вариант вообще не нравится.

belov-evgenii
Сообщения: 52
Зарегистрирован: 28 сен 2007, 10:19

Сообщение belov-evgenii » 06 ноя 2007, 09:00

fmcoder писал(а):Можно конечно тупо прочитать все значения в массив, и уже в программе выбрать одно
1, 2, 3, ... млн?

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

Сообщение kdv » 06 ноя 2007, 09:29

пишем автоматизацию розыгрыша лотереи?
только там нужны "случайные" записи.

rand - это udf. да, order by можно. но order by - сортировка массива записей, т.е. затраты могут зависеть от объема записей.
таблица состоит из одного поля (FK), т.е. значения там уникальные, но никакого порядка нет.
уникальные значения только в ПК.
никакого порядка у записей обычно нет, пока не дать order by.
порядок может случайно возникнуть при физическом хранении записей. но может и измениться со временем.

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Re: Выбрать одну случайную строку

Сообщение Slavik » 06 ноя 2007, 09:52

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

select first 1 skip :RAND * from ...
В параметр :RAND на клиенте пихаешь случайное целое число от нуля до количества записей в таблице минус одну. И не надо никаких order by.

fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

Re: Выбрать одну случайную строку

Сообщение fmcoder » 06 ноя 2007, 17:32

Slavik писал(а):

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

select first 1 skip :RAND * from ...
В параметр :RAND на клиенте пихаешь случайное целое число от нуля до количества записей в таблице минус одну. И не надо никаких order by.
Спасибо, заработало!

kdv - нет, это не лотерея. Это что-то вроде плеера в случайном режиме воспроизведения.
А почему уникальные значения только в PK?
У меня таблица создается так:

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

create table "Tracks1" ("id" int UNIQUE REFERENCES "Tracks")

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

Сообщение kdv » 06 ноя 2007, 17:54

А почему уникальные значения только в PK?
У меня таблица создается так:
неправильно. учи матчасть. В соответствии с нормальными формами идентификатор записи называется Первичный Ключ (Primary Key). Любые другие столбцы, могущие также идентифицировать запись, но являющиеся ВТОРОСТЕПЕННЫМИ "идентификаторами", типа "номер паспорта", называются АЛЬТЕРНАТИВНЫМИ ключами. Для них и используется constraint UNIQUE.
Который по стандарту ДОПУСКАЕТ НАЛИЧИЕ NULL, в отличие от Primary Key.

кроме того, references - это неявный Foreign Key.
Так что на самом деле ты создал
1. неименованный constraint unique
2. неименованный constraint foreign key

И дальше советую разрабатывать без идиотских двойных кавычек.
http://www.ibase.ru/ibfaq.htm#dtproblem

fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

Сообщение fmcoder » 11 ноя 2007, 18:08

ОК, с pk и fk разобрались
kdv писал(а):И дальше советую разрабатывать без идиотских двойных кавычек.
http://www.ibase.ru/ibfaq.htm#dtproblem
Про это я знаю, кажется это описано в release notes, т.е. это штатное поведение системы. И наверное название парагрфа "Проблема с именами объектов в двойных кавычках в 3-ем диалекте" не совсем корректно.

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

Сообщение kdv » 11 ноя 2007, 20:00

не совсем корректно.
корректно. Двойные кавычки дают указанные проблемы. Если не согласен - докажи обратное.
Я в курсе, что двойные кавычки в третьем диалекте были придуманы в IB 6.0. Однако пока ничего кроме проблем от них нет.

fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

Сообщение fmcoder » 21 ноя 2007, 00:50

kdv писал(а):
не совсем корректно.
корректно. Двойные кавычки дают указанные проблемы. Если не согласен - докажи обратное.
Я в курсе, что двойные кавычки в третьем диалекте были придуманы в IB 6.0. Однако пока ничего кроме проблем от них нет.
Тут скорее не проблемы, а особенности работы... Я привык их везде писать, и проблем с этим нет. Правда, смысла их использовать в общем-то нет. Мне в кавычках легче увидеть названия полей/таблиц и т.п. - пишу в Delphi, там подсветки SQL кода в строковых переменных нет.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 ноя 2007, 10:54

fmcoder писал(а):пишу в Delphi, там подсветки SQL кода в строковых переменных нет.
:shock: а ты его прямо в Delphi пишешь?
Я его туда только вставляю после проверки и отладки.

fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

Сообщение fmcoder » 23 ноя 2007, 20:02

WildSery писал(а):
fmcoder писал(а):пишу в Delphi, там подсветки SQL кода в строковых переменных нет.
:shock: а ты его прямо в Delphi пишешь?
Я его туда только вставляю после проверки и отладки.
Да :), а где еще можно? Проверка и отладка выполняется после запуска самой программы.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 24 ноя 2007, 00:59

А чё так скромно-то? Надо после внедрения на другой половине шарика.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 26 ноя 2007, 07:45

fmcoder писал(а):
Да :), а где еще можно? Проверка и отладка выполняется после запуска самой программы.
Я обычно в IBExpert это делаю, но вольному воля .........

Ответить