Ответ
Misha v.3 08.10.2007 13:01
если банеры хранятся в БД, то простейшем случае ничего кроме 4 запросов на ум не приходит (первый запрос -- достать количество записей, второй и далее -- достается банер с $.limit(1) и $.offset(^math:random(количество)), при этом предварительно проверяется не доставали ли мы уже банер с этим offset-ом)
в случае, когда нужно отобразить много разных банеров на странице (в том числе которые могут храниться в разных источниках) мы использовали несколько иной подход: формировали "наборы банеров", которые потом и показывались целиком. в простом случае этот "набор" содержит id-шек банеров (выбираются также как я описал в начале), а затем набор "кешируется" (в БД, файле или hashfile, мы использовали hashfile). таких наборов по определённым условиям делалось несколько, и они ротировались (линейно, показался первый -- за ним покажется второй, потом третий и т.д.). понятное дело, что это не "случайный" показ банеров, но для наших задач этого хватало, а т.к. мы имели сложные и разнородные банеры, то таким образом мы сильно снизили количество запросов к SQL серверу (на самом деле в наборе мы хранили не просто id банеров, а банеры целиком: ссылку, путь к файлу, текст).