Страница 1 из 1
Выбрать одну случайную строку
Добавлено: 05 ноя 2007, 22:16
fmcoder
Задача проста - выбрать одну случайную строку из таблицы.
В таблице нет PK, поэтому просто сделать в программе random id не получится.
Также, не хотелось бы использовать udf.
Вроде, такое должно как-то решаться средствами сервера... Но что-то я не нашел.
Помогите, пожалуйста.
Добавлено: 05 ноя 2007, 23:05
kdv
нету в множествах такого понятия как "случайная строка". тем более если запись нечем идентифицировать.
Также, не хотелось бы использовать udf.
интересно, каким же это образом не имея ПК можно выбрать "случайную" запись при помощи UDF?
могу сгенерить тебе случайную дату и случайное слово. По ним выбери что-нибудь из БД:
'10.11.1999'
"пардон"
Добавлено: 05 ноя 2007, 23:55
fmcoder
Ну как везде пишут (в темах, посвященных этому вопросу):
Т.е записи отсортируются по случайному значению... Вроде как это то что надо, но очень хочется обойтись без UDF.
Еще, я так понимаю, чтобы ограничить кол-во возвращаемых записей, нужно использовать first(1)?
UPD Да, еще забыл сказать: таблица состоит из одного поля (FK), т.е. значения там уникальные, но никакого порядка нет. Нужно взять одно из них.
Можно конечно тупо прочитать все значения в массив, и уже в программе выбрать одно, но мне такой вариант вообще не нравится.
Добавлено: 06 ноя 2007, 09:00
belov-evgenii
fmcoder писал(а):Можно конечно тупо прочитать все значения в массив, и уже в программе выбрать одно
1, 2, 3, ... млн?
Добавлено: 06 ноя 2007, 09:29
kdv
пишем автоматизацию розыгрыша лотереи?
только там нужны "случайные" записи.
rand - это udf. да, order by можно. но order by - сортировка массива записей, т.е. затраты могут зависеть от объема записей.
таблица состоит из одного поля (FK), т.е. значения там уникальные, но никакого порядка нет.
уникальные значения только в ПК.
никакого порядка у записей обычно нет, пока не дать order by.
порядок может случайно возникнуть при физическом хранении записей. но может и измениться со временем.
Re: Выбрать одну случайную строку
Добавлено: 06 ноя 2007, 09:52
Slavik
В параметр :RAND
на клиенте пихаешь случайное целое число от нуля до количества записей в таблице минус одну. И не надо никаких order by.
Re: Выбрать одну случайную строку
Добавлено: 06 ноя 2007, 17:32
fmcoder
Slavik писал(а):В параметр :RAND
на клиенте пихаешь случайное целое число от нуля до количества записей в таблице минус одну. И не надо никаких order by.
Спасибо, заработало!
kdv - нет, это не лотерея. Это что-то вроде плеера в случайном режиме воспроизведения.
А почему уникальные значения только в PK?
У меня таблица создается так:
Код: Выделить всё
create table "Tracks1" ("id" int UNIQUE REFERENCES "Tracks")
Добавлено: 06 ноя 2007, 17:54
kdv
А почему уникальные значения только в 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
Добавлено: 11 ноя 2007, 18:08
fmcoder
ОК, с pk и fk разобрались
Про это я знаю, кажется это описано в release notes, т.е. это штатное поведение системы. И наверное название парагрфа "Проблема с именами объектов в двойных кавычках в 3-ем диалекте" не совсем корректно.
Добавлено: 11 ноя 2007, 20:00
kdv
не совсем корректно.
корректно. Двойные кавычки дают указанные проблемы. Если не согласен - докажи обратное.
Я в курсе, что двойные кавычки в третьем диалекте были придуманы в IB 6.0. Однако пока ничего кроме проблем от них нет.
Добавлено: 21 ноя 2007, 00:50
fmcoder
kdv писал(а):не совсем корректно.
корректно. Двойные кавычки дают указанные проблемы. Если не согласен - докажи обратное.
Я в курсе, что двойные кавычки в третьем диалекте были придуманы в IB 6.0. Однако пока ничего кроме проблем от них нет.
Тут скорее не проблемы, а особенности работы... Я привык их везде писать, и проблем с этим нет. Правда, смысла их использовать в общем-то нет. Мне в кавычках легче увидеть названия полей/таблиц и т.п. - пишу в Delphi, там подсветки SQL кода в строковых переменных нет.
Добавлено: 21 ноя 2007, 10:54
WildSery
fmcoder писал(а):пишу в Delphi, там подсветки SQL кода в строковых переменных нет.

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

а ты его прямо в Delphi пишешь?
Я его туда только вставляю после проверки и отладки.
Да

, а где еще можно? Проверка и отладка выполняется после запуска самой программы.
Добавлено: 24 ноя 2007, 00:59
Merlin
А чё так скромно-то? Надо после внедрения на другой половине шарика.
Добавлено: 26 ноя 2007, 07:45
stix-s
fmcoder писал(а):
Да

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