Не знаю, как реализовать "приоритет" (или "вес") - MySQL

Узнай цену своей работы

Формулировка задачи:

Нужно создать базу для приложения, выдающего ссылки с рекламными банерами. С одной стороны есть баннеры, с другой сайты, их запрашивающие мысль была такова - создать в базе две таблицы: 1.

Id

,

Banner_file_name

,

last_shown

(время последнего показа),

referal

(поле, отвечающее за "набор сайтов, где этот баннер должен показываться",

counter

(счетчик показов), (ну и всякая там мишура, типа поля типа "описание", и пр., несущественно) 2.

Id

,

Site_address

,

описание

(чисто информация для человеков) в приложение приходит запрос с "адресом сайта" (из второй таблицы). Дальнейший мой ход рассуждений был таков: из 1-й таблицы по соответствию site_address = referal выбирается строка С САМЫМ СТАРЫМ ВРЕМЕНЕМ ПОСЛЕДНЕГО ПОКАЗА, вынимается имя файла с банером, отдается назад в приложение, после чего обновляется счетчик "время последнего показа" (за счет этого счетчика, я надеюсь, будет осуществляться "ротация" банеров). Так вот, вопрос, который я вообще не представляю, как реализовать, связан с пожеланием возможности в программе назначить одним банерам приоритет в показе по отношению к другим. То есть, допустим есть три баннера - А, Б и В. И вот баннер В нужно показывать (допустим) в три раза чаще, чем баннеры А и Б. То есть, это и есть главный вопрос темы - КАК реализовать такую возможность? И второй вопрос, про вариант решения которого у меня "смутные представления" есть, но не уверен. Если один баннер должен показываться на нескольких сайтах, как лучше всего прописать их в поле referal таблицы 1. Я думал вписывать туда разделенные запятыми Id-ы со второй таблицы, а проверку при выборке выполнять с помощью IN. Может есть решения получше?

Решение задачи: «Не знаю, как реализовать "приоритет" (или "вес")»

textual
Листинг программы
SET @offset = 0, @point = FLOOR(RAND() * 100);
 
SELECT * FROM таблица WHERE @offset < @point AND (@offset := @offset + priority) >= @point;

Объяснение кода листинга программы

В данном коде выполняется выборка данных из таблицы таблица с использованием двух переменных: @offset и @point.

  1. Переменная @offset инициализируется значением 0.
  2. Переменная @point вычисляется как результат деления случайного числа на 100.
  3. В строке WHERE формируется условие для выборки данных. В данном случае выбираются все строки, удовлетворяющие условию, что значение переменной @offset меньше значения переменной @point и значение переменной @offset, увеличенное на значение переменной priority, больше или равно значению переменной @point. Список переменных и их значений:
  4. SET @offset = 0 - переменная @offset инициализируется значением 0.
  5. SET @point = FLOOR(RAND() * 100) - переменная @point вычисляется как результат деления случайного числа на 100.
  6. SELECT * FROM таблица WHERE @offset < @point AND (@offset := @offset + priority) >= @point - в данном условии используется переменная @offset, значение которой увеличивается на значение переменной priority. Пожалуйста, обратите внимание, что в запросе может быть использована функция RAND(), которая генерирует случайное число. Для ее работы необходимо наличие оператора HAVING в SQL запросе.

Оцени полезность:

9   голосов , оценка 4.444 из 5