Кто-нибудь знает, как это сделать - что было бы эквивалентно этому: "выберите * из ВАШЕЙ_ТАБЛИЦЫ order by rand () limit 1" в mysql ??
Может, в SDB нет возможности?
Кто-нибудь знает, как это сделать - что было бы эквивалентно этому: "выберите * из ВАШЕЙ_ТАБЛИЦЫ order by rand () limit 1" в mysql ??
Может, в SDB нет возможности?
Я действительно говорил об этом с представителем Amazon. Что вы должны сделать, так это сохранить случайное значение вместе с вашими данными в SDB. Когда вы хотите вернуть строку, вы генерируете другое случайное значение и выбираете первый результат меньше этого. Таким образом, вам нужно сохранить немного больше данных, но для этого потребуется всего один запрос.
Я понимаю, что с момента публикации этого вопроса прошло уже более 18 месяцев, но на случай, если это понадобится кому-то еще, я все равно опубликую свой ответ. Если единообразие выбора не важно, тогда подход, описанный Джастином, верен. Однако, если единообразие важно, вы можете использовать адаптацию подхода Джастина (в очень грубом псевдокоде):
Generate a random value
Generate a random boolean
If the boolean is true {
Select the first item with a randomizer less than or equal to the random value
}
otherwise {
Select the first item with a randomizer greater than or equal to the random value
}
Generate a new random value
Set the selected items randomizer to the new random value
Я сделал более подробную запись по этому поводу на мой блог с примерами, показывающими, почему распределение вероятностей нарушено.
Нет, в SimpleDB нет случайных функций. Вам придется реализовать случайную часть самостоятельно.
Вы можете сделать что-то вроде:
count = sdb.select("select count(*) from YOUR_TABLE")
random = (rand() * count) + 1
nextToken = sdb.select("select count(*) from YOUR_TABLE limit " + random)
item = sdb.select("select * from YOUR_TABLE limit 1" , nextToken)
Но для этого требуется как минимум три запроса. Первый придется повторять до тех пор, пока вы не получите полный счет (без NextToken). Вторую нужно повторять до тех пор, пока вы не достигнете числа случайных (2500 на запрос максимум), если вы не сохранили несколько NextTokens из первого набора запросов.
В целом не очень удобно.