Как я могу показывать мои объявления равное количество раз? - PullRequest
0 голосов
/ 10 декабря 2010

Я создаю свою собственную рекламную платформу, и у меня есть небольшая проблема.Как я могу показывать мои объявления равное количество раз?

Например:

Name    |    Views

Ads 1   |    100

Ads 2   |    98

Ads 3   |    99

Моя система должна показывать объявления с наименьшим количеством просмотров, в данном случае «Объявления 2 или Объявления 3».Так что все мои объявления следуют друг за другом.Поэтому, когда мои 3 объявления имеют 3000 просмотров, на каждом просмотре должно быть 1000 просмотров.

Я пишу код на PHP, и у меня нет примера, потому что мне нужно вдохновение, как решить мою проблему.

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

Выберите наименее просматриваемое добавление, например, так:

SELECT * FROM ads ORDERBY views ASC LIMIT 0, 1

Таким образом, все объявления с меньшим количеством просмотров будут медленно догоняться.

- Изменить, используя следующее требование

probabilityForHighestScore = 30;
random = rand(0, 100);

if (random > probabilityForHighestScore)
    SELECT * FROM ads ORDERBY views ASC LIMIT 0, 1
else
    SELECT * FROM ads ORDERBY score DESC LIMIT 0, 1

Если вам нужно что-то еще, вам лучше сначала объяснить все ваши требования.Потому что, если вам неясно, это не будет ясно в вашем вопросе, и ответы не будут делать то, что вы хотите.

0 голосов
/ 10 декабря 2010

Я предполагаю, что у вас есть таблица базы данных, содержащая информацию об этих объявлениях. Вы можете добавить, если у вас его еще нет, поле 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...