|
Получить случайное значение id
|
|||
---|---|---|---|
#18+
Здравствуйте. Каким запросом получить случайное значение id (autoincrement) из таблицы и сохранить его в переменную(php) ? Т.е. чтоб в переменной было именно число. БД - Firebird. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 14:10 |
|
Получить случайное значение id
|
|||
---|---|---|---|
#18+
skelmen, никаким. в sql нет понятия "случайная запись". Получить случайный номер уже сгенеренного id (и записанного в таблицу) можно только при следующих условиях: - должна быть 100% уверенность, что в таблице есть записи с непрерывными id от n до m - максимальный (m) id можно получить select max(id) from table, минимальный - min(id) - получить random число в диапазоне от n до m - выбрать запись с таким id из таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 14:23 |
|
Получить случайное значение id
|
|||
---|---|---|---|
#18+
kdvskelmen, никаким. в sql нет понятия "случайная запись". Получить случайный номер уже сгенеренного id (и записанного в таблицу) можно только при следующих условиях: - должна быть 100% уверенность, что в таблице есть записи с непрерывными id от n до m - максимальный (m) id можно получить select max(id) from table, минимальный - min(id) - получить random число в диапазоне от n до m - выбрать запись с таким id из таблицы. Понял, хорошо. А если вернуть все значения id в виде массива, а потом выбрать из него случайное? Так можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 15:03 |
|
Получить случайное значение id
|
|||
---|---|---|---|
#18+
skelmenА если вернуть все значения id в виде массива, а потом выбрать из него случайное? Так можно? можно, только у тебя php лопнет, если в этой таблице десятки или сотни тысяч записей. Они же в память php полезут. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 15:07 |
|
Получить случайное значение id
|
|||
---|---|---|---|
#18+
skelmen, 1) сколько примерно записей в таблице и, если много, то есть ли по полю id убывающий индекс ? 2) распределение значений id - сильно дырявое или нет ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 15:25 |
|
Получить случайное значение id
|
|||
---|---|---|---|
#18+
насколько велика таблица источник? Если крохотная, в лоб как-то так: select first 1 id from tbl order by rand() или select first 1 skip rand()*(select count(*) from tbl) id from tbl для больше 1000 записей я бы не стал использовать столь дуболомную конструкцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 18:01 |
|
Получить случайное значение id
|
|||
---|---|---|---|
#18+
Вариант 1: Если поле (F) проиндексировано по возрастанию, и известны минимальное и максимальное значение, можно попробовать взять произвольное число (N) между min и max и потом SELECT FIRST 1 F ... WHERE F > N. Это быстрее skip random. Получится - да, случайное число, но нужно понимать, что из-за дырок в нумерации распределение будет не равномерным. Например, если SELECT F даёт 1, 2, 3, 4, 100500, то выпадать будут постоянно эти самые 100500. Вариант 2: создать GTT (F, NO_HOLES_SIR), заполнять её заново перед каждой серией выборок, ручками обеспечивая бездырочность поля NO_HOLES_SIR, и уже на эти данные кастовать Вариант 1. Ну и классика: Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 19:23 |
|
|
start [/forum/topic.php?fid=40&fpage=76&tid=1562819]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 279ms |
total: | 415ms |
0 / 0 |