Я предполагаю, что у вас есть таблица базы данных, содержащая информацию об этих объявлениях. Вы можете добавить, если у вас его еще нет, поле views
к этой таблице. Затем, когда вам нужно показать объявление, вы просто берете объявление с наименьшим количеством просмотров, добавляете 1 к его счетчику просмотров и отображаете объявление.
Edit:
Проблема с решением @MarvinLabs, как я объясняю в комментариях, заключается в том, что он дает огромный бонус отдельной записи.
Допустим, у вас есть 50 отдельных объявлений в вашей системе. Скажем также, что ваш самый высокий результат - 9,9/10, а ваш второй рекорд - 9,8 / 10. Оба эти элемента имеют очень высокий балл, но если вы используете код @MarvinLabs, запись с наивысшей оценкой получит 30% всех просмотров, а вторая запись с наивысшей оценкой получит 1,4% всех просмотров (70% всех просмотров разделены 49 не самых высоких баллов рекламы).
Что вы, возможно, захотите рассмотреть, так это включение более широкого диапазона высокоэффективных объявлений. Вы можете сделать это одним из трех способов:
Сначала вы можете установить порог или несколько порогов, которые делят определенный процент просмотров на определенные диапазоны оценок. Например, вы могли бы сделать так, чтобы объявления, которые набрали более 9/10, получили 30% всех просмотров. Вы бы сделали это так:
$random = rand(1,100);
if ($random > 30) {
$sql = "SELECT * FROM ads WHERE score >= 9 ORDER BY views ASC";
} else {
$sql = "SELECT * FROM ads WHERE score < 9 ORDER BY views ASC";
}
Проблема в том, что если у вас нет рекламы с показателем выше 9, вы ничего не получите. По этой причине вы, вероятно, не хотите использовать этот метод.
Во-вторых, вы можете распределить свои 30% просмотров по 5 или 10 лучшим объявлениям:
SELECT *
FROM ads
WHERE id IN
(SELECT id
FROM ads
ORDER BY score DESC
LIMIT 10)
ORDER BY views ASC;
Это решает проблему «что, если у меня нет записей выше порогового значения», в то же время распределяя «бонус за высокий балл» более чем на одну запись. Проблема с этим, если вы считаете это проблемой, заключается в том, что она не масштабируется с объемом рекламы, которая у вас есть в записи. Независимо от того, есть ли у вас 10 или 10 000 записей, вы все равно дадите бонус только 10 (или 20, или 50 ... независимо от того, что вы установили).
Если вы хотите масштабировать, вам нужно третье решение.
Третье решение состоит в том, чтобы установить свой лимит на основе процента от общего количества записей в таблице. Поскольку MySQL не имеет встроенного способа обработки этого, вам придется обойти это одним из двух способов:
Один способ сделать это ленивым способом и запустить два запроса - один для получения текущего количества записей, а другой для создания запроса на его основе. Например:
$query1 = "SELECT COUNT(*) FROM ads";
//store result in $count
$percentage = round($count * 0.10); //get 10% of records
$query2 = "SELECT * FROM ads WHERE id IN " .
"(SELECT id " .
" FROM ads " .
" ORDER BY score DESC " .
" LIMIT " . $percentage . ") " .
"ORDER BY views ASC"
Лучше было бы избежать второго обхода базы данных и использовать подготовленное утверждение:
SELECT @percentage := ROUND(COUNT(*) * 10/100) FROM ads;
PREPARE PERCENTAGE FROM
SELECT *
FROM ads
WHERE id IN
(SELECT id FROM ads
ORDER BY score DESC
LIMIT ?)
ORDER BY views ASC;
EXECUTE PERCENTAGE USING @percentage;