Calcul du classment des printings d'annonces

Je travaille actuellement sur un système de rotation de la database où certaines des publicités ont plus d'printing (ou de rang) que d'autres et devraient être montrées plus souvent.

Quel est le meilleur moyen de calculer le classment des printings tout en conservant l'apparence des publicités "randoms"? À quoi ressemblerait la structure de la table pour la database? Le calcul doit-il être effectué dans la database ou dans le code?

Certaines questions connexes peuvent également être utiles:

  • Choix pondéré random dans T-SQL
  • Choix pondéré random

voici une excellente solution qui permet de pondérer, sa coldfusion mais le sql est là aussi article

DECLARE @girl TABLE ( id INT IDENTITY( 1, 1 ), name VARCHAR( 50 ), weight INT ); INSERT INTO @girl ( name, weight )( SELECT 'Sarah', 100 UNION ALL SELECT 'Libby', 30 UNION ALL SELECT 'Lisa', 30 UNION ALL SELECT 'Molly', 250 UNION ALL SELECT 'Kit', 50 ); SELECT g.id, g.name, g.weight FROM @girl g INNER JOIN ( -- --In this inner query, we need to select a random, --weighted ID. We are doing this in the inner query --rather than in the outter query so that our --intermediary table doesn't need to contain so --much information (just the ID). ---> SELECT TOP 1 g.id FROM @girl g INNER JOIN pivot1000 p ON ( -- Use the weights. ---> g.weight >= p.id --Use any additional filtering that is required by the business logic of the query criteria. AND g.name != 'Lisa' ) ORDER BY -- Select random row. ---> NEWID() ASC ) AS temp_id ON g.id = temp_id.id 

Nous avons écrit une fonction MySQL pour notre server de publicité open source AdServerBeans MyAds ( http://www.adserverbeans.com ) qui sélectionne une bannière prenant en count de façon random les partages de trafic:

 DELIMITER ;; DROP FUNCTION if exists get_random_banner_by_traffic_share; CREATE FUNCTION get_random_banner_by_traffic_share(valid_banners TEXT, total_traffic_share INTEGER) RETURNS INTEGER NOT DETERMINISTIC BEGIN DECLARE pos INTEGER DEFAULT 1; DECLARE rnd INTEGER DEFAULT 0; DECLARE current_traffic_share INTEGER DEFAULT 0; DECLARE banner_id INTEGER; DECLARE banner_traffic_share INTEGER; SET rnd = RAND()*(total_traffic_share-1)+1; WHILE pos < LENGTH(valid_banners) DO SET pos = POSITION(';' IN valid_banners); SET banner_id = CONVERT(SUBSTR(valid_banners,1,pos-1),SIGNED); SET valid_banners=SUBSTRING(valid_banners FROM pos+1); SET pos = POSITION(';' IN valid_banners); SET banner_traffic_share = CONVERT(SUBSTR(valid_banners,1,pos-1),SIGNED); SET valid_banners=SUBSTRING(valid_banners FROM pos+1); if(current_traffic_share < rnd and rnd <= (banner_traffic_share+current_traffic_share)) THEN RETURN banner_id; END IF; SET current_traffic_share=current_traffic_share+banner_traffic_share; END WHILE; END; ;; delimiter ; 

Les procédures / fonctions stockées MySQL ne prennent pas en charge les arrays / lists. Nous avons donc dû utiliser une string avec des délimiteurs. Dans cette fonction, faites attention à la ligne:

 SET rnd = RAND()*(total_traffic_share-1)+1; 

qui sélectionne de manière random une valeur de 1 à 100. Nous recherchons ensuite la bannière qui se trouve dans cette plage. Notez que cet algorithm est probablement accepté pour une petite quantité d'annonces ciblant le même location d'annonce. Vous pourriez avoir une histoire différente.