WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MySQL, random + biased/weighted mot äldsta? (https://www.wn.se/forum/showthread.php?t=1061181)

JesperA 2014-03-13 18:41

Har testat en av möjligheterna nu och är ganska nära det jag vill åt, äldsta har definitivt mer "vikt" men ser ut att ha ganska seriösa "brytpunkter" och senaste inlägget har löjligt låg "vikt" :P Så får fixa en bättre logaritmiskt urval som slumpgenerator sen, fibonacci är ju en ganska enkel lösning

http://f.cl.ly/items/0C0o1z0d3F0J273l1L2y/Random.png

Kod:

CREATE TABLE `NewsPostsTest` (
  `PostID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `PostTitle` varchar(512) CHARACTER SET utf8 COLLATE utf8_swedish_ci DEFAULT NULL,
  `PostTime` datetime DEFAULT NULL,
  `PostViewCount` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`PostID`),
  KEY `PostTime` (`PostTime`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8;


PHP-kod:

<?php


for ($i 0$i 2$i++) {


// Select random year-month-day without the - and weighted to newest, it will be reversed in the query
$TheRand mt_rand(mt_rand(2012010120141212),20141212 );





$PostQuery $db->prepare("
    SELECT
        *,
        DATE_FORMAT(PostTime, '%Y%m%d') as SuperTime
    FROM
        NewsPostsTest
    HAVING
        SuperTime <= 
$TheRand
    ORDER BY
        RAND()
    LIMIT
        5
"
);


$PostQuery->execute();




while (
$PostData $PostQuery->fetch(PDO::FETCH_ASSOC)) {


$PostUpdate $db->query("
    UPDATE
        NewsPostsTest
    SET
        PostViewCount    = PostViewCount+1
    WHERE
        PostID            = '
{$PostData[PostID]}'
"
);


// End of PostData while loop



// End of for loop

(ja, allt är fulkodat nu under testet)

Conny Westh 2014-03-13 20:15

Gör LIMIT på de rader du vill ha så borde detta funka... (Har ej testat syntaxen)

Kod:

SELECT POSTID,  -RAND()*PostID AS random_value
FROM TestTable
ORDER BY random_value DESC

-RAND*POSTID gör att äldre tupler (som har lägre värde på POSTID) kommer att visas oftare. Du kan lägga till en FAKTOR som ändrar hur snabbt värdet minskar.

JesperA 2014-03-13 22:43

Citat:

Ursprungligen postat av ConnyWesth (Inlägg 20488315)
Gör LIMIT på de rader du vill ha så borde detta funka... (Har ej testat syntaxen)

Kod:

SELECT POSTID,  -RAND()*PostID AS random_value
FROM TestTable
ORDER BY random_value DESC

-RAND*POSTID gör att äldre tupler (som har lägre värde på POSTID) kommer att visas oftare. Du kan lägga till en FAKTOR som ändrar hur snabbt värdet minskar.

Japp den query fungerar hyfsat ok också men den är sjukt vägd åt äldsta raden i databasen, den träffas närapå 100% av gångerna, efter 20´000 körningar:

http://f.cl.ly/items/2R023q0V3w0Q0j241r3W/random2.png

Så kurvan liknar denna (där uppåt är sannolikhet & höger är dom äldre raderna)
http://www.helvarsupport.com/dev/hel...ming_curve.png


Skulle vilja ha kurvan lite mer som den svarta här:
http://mathworld.wolfram.com/images/...arithm_900.gif


Alla tider är GMT +2. Klockan är nu 18:05.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson