база данных для случайного выбора - PullRequest
2 голосов
/ 11 августа 2011

Я хотел иметь возможность произвольно выбирать строки из таблицы таким образом, чтобы масштабироваться до больших таблиц в MySQL. Насколько я понимаю, сейчас это невозможно. Есть ли другие базы данных, с которыми я мог бы сделать это?

Ответы [ 3 ]

1 голос
/ 11 августа 2011

Нужно ли делать этот тип выбора с помощью SQL?Если нет, вы можете сгенерировать случайное число в коде, а затем получить соответствующую запись по сгенерированному номеру.Конечно, это делает несколько предположений:

  • Требует, чтобы ваши идентификаторы были идентичным семенем
  • Ваше случайное число ограничено минимальными и максимальными значениями.
1 голос
/ 11 августа 2011

Попробуйте это:

SELECT ColumnName 
FROM TableName
ORDER BY RAND()
LIMIT 1;
0 голосов
/ 11 августа 2011

Я думаю, что это можно сделать ... Извините - это TSQL, но FWIW

Declare 
   @max int, 
   @min int, 
   @rand int

set @max = (select max(id) from myTable)
set @min = (select min(id) from myTable)
set @rand = Cast(((@max + 1) - @min) * Rand() + @min as int)

select * from myTable where id = @rand

Или, если у вас есть пробелы в полях первичного ключа, то:

select max(id) from myTable where id <= @rand

Возражение Пер @ Эндрю - он обеспокоен тем, что это будет способствовать меньшему количеству идентификаторов в несоответствующих конкурсах.Если это проблема, вы можете справиться несколькими способами:

Взять 2 записи за раз (мин и макс).Например:

INSERT INTO whatever_table_variable_etc
select max(id) from myTable where id <= @rand
UNION
select min(id) from myTable where id >= @rand

Или вы можете основывать его на коэффициентах и ​​четностях.Например:

Declare @isOdd bool
SET @isOdd= CASE WHEN ABS(@rand) % 2 = 1 THEN 1 ELSE 0 END

If @isOdd = 1
   select max(id) from myTable where id <= @rand
ELSE 
   select min(id) from myTable where id >= @rand
...