Kom ihåg mig?
Home Menu

Menu


MySQL, random + biased/weighted mot äldsta?

 
Ämnesverktyg Visningsalternativ
Oläst 2014-03-13, 18:41 #11
JesperA JesperA är inte uppkopplad
Medlem
 
Reg.datum: Jul 2008
Inlägg: 214
JesperA JesperA är inte uppkopplad
Medlem
 
Reg.datum: Jul 2008
Inlägg: 214
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



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)

Senast redigerad av JesperA den 2014-03-13 klockan 18:44
JesperA är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-03-13, 20:15 #12
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-03-13, 22:43 #13
JesperA JesperA är inte uppkopplad
Medlem
 
Reg.datum: Jul 2008
Inlägg: 214
JesperA JesperA är inte uppkopplad
Medlem
 
Reg.datum: Jul 2008
Inlägg: 214
Citat:
Ursprungligen postat av ConnyWesth Visa inlägg
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:



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:
JesperA är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 23:40.

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