代码之家  ›  专栏  ›  技术社区  ›  janhartmann

计算广告印象排名

  •  1
  • janhartmann  · 技术社区  · 15 年前

    3 回复  |  直到 14 年前
        1
  •  2
  •   andrewWinn    15 年前

    这是一个很好的解决方案,它允许加权,它的coldfusion,但是sql也存在 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
    
        2
  •  1
  •   Community CDub    7 年前

    一些相关问题可能也会有所帮助:

        3
  •  0
  •   Vitaly Sazanovich    14 年前

    我们已经为我们的开源广告服务器AdServerBeans MyAds编写了一个MySQL函数( http://www.adserverbeans.com )在考虑流量共享的情况下随机选择横幅:

    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 ;
    

    MySQL存储过程/函数不支持数组/列表。所以我们必须使用带分隔符的字符串。 在此函数中,请注意以下行:

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

    随机选择1到100之间的值。 那么我们就在那个范围内寻找旗帜。