Идея FastPass мне похожа на решение для систем, где я должен выполнить задачи 1 через N, и на основе некоторого знания я имею обо мне (в Disney, я мог бы знать, что моими детьми будет много счастливой Испытательной площадки поездки при ожидании Soarin' интервала времени FastPass для прибытия) , я мог запланировать меня, чтобы войти в очередь 'FastPass' для задачи N и также войти в стандартную очередь для задачи M. Это работало бы, где порядок задачи не обязательно важен и где время очереди было известно, и я мог оценить, сколько времени это возьмет, чтобы сделать задачу M или N. Не уверенный у меня есть хороший реальный пример программирования, хотя - большая часть наших взглядов линейна по своей природе и таким образом, наши рабочие процессы имеют тенденцию быть тем путем.
Это работает в MSSQL, и я уверен, что должна быть возможность изменить пару ключевых слов, чтобы они работали и в MySQL (возможно, даже лучше):
SELECT TOP 1 t.*
FROM @Table t
INNER JOIN (SELECT t.id, sum(tt.weight) AS cum_weight
FROM @Table t
INNER JOIN @Table tt ON tt.id <= t.id
GROUP BY t.id) tc
ON tc.id = t.id,
(SELECT SUM(weight) AS total_weight FROM @Table) tt,
(SELECT RAND() AS rnd) r
WHERE r.rnd * tt.total_weight <= tc.cum_weight
ORDER BY t.id ASC
Идея состоит в том, чтобы иметь совокупный вес для каждой строки (подвыбор-1) , затем найдите положение составного RAND () в этом совокупном диапазоне.
Может быть, этот:
SELECT * FROM <Table> T JOIN (SELECT FLOOR(MAX(ID)*RAND()) AS ID FROM <Table> ) AS x ON T.ID >= x.ID LIMIT 1;
Или этот:
SELECT * FROM tablename
WHERE somefield='something'
ORDER BY RAND() LIMIT 1
Я не помню, как использовать RND () в mysql, но здесь рабочий пример для MSSQL:
SELECT TOP(1) (weight +RAND ()) r, id, content, weight FROM Table
ORDER BY 1 DESC
Если TOP (1) не применим, вы просто выбираете первую запись из общего набора результатов .