FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Medlem
|
Skulle behöva en skön & enkel query som väljer ut random rader i databasen men "väger" mer mot dom äldre raderna då det är viktigt att dom äldsta raderna inte "glöms" bort.
Tabellen innehåller fler kolumner än det jag nämner, men det är dom kolumnerna jag har att använda för queryn, tyvärr. Har googlat på biased & weighted queries i MySQL men dom flesta jag hittat använder en tabell med "score", "multiplier" osv för att använda som "tyngd" i queryn, någon sådan har jag alltså inte. Kolumnerna som skall användas för detta är: Kod:
CREATE TABLE `TestTable` ( `PostID` int(11) unsigned NOT NULL AUTO_INCREMENT, `PostTitle` varchar(250) DEFAULT NULL, `PostDate` datetime DEFAULT NULL, PRIMARY KEY (`PostID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Skulle vilja få ut 10st random rader från hela tabellen men med mer vikt mot dom äldre, några förslag på en smidig lösning? |
||
![]() |
![]() |
![]() |
#2 | |||
|
||||
Mycket flitig postare
|
En enklare lösning skulle väl kunna vara att göra följande i ett programmeringsspråk:
- Räkna antalet rows i tabellen. - Slumpa tal mellan 0 och antalet rows i tabellen. - Skriv ut och sortera efter "datum DESC" så de äldsta syns först. Vet tyvärr inte om det går att göra i SQL direkt (kanske går). |
|||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Medlem
|
Citat:
|
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Medlem
|
I väntan på en SQL-expert som kan skapa en funktion som löser det åt dig så skulle du ju kunna splitta upp det hela i t.ex 3 queries som du mergar i efterhand. T.ex query 1 med "äldre än X", och 2 "äldre än x" osv. På så sätt styr du själv på ett ungefär det förväntade resultatet.
|
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Supermoderator
|
Du gör nog bäst i att köra viktningen i scriptet. Det blir mer flexibelt och när du har så få rader så kan du som du säger göra lite som du själv vill med datan. Alternativt kan du ju bara lägga in ett extra viktningsfält i databasen som du uppdaterar en gång per dygn eller liknande beroende på hur ofta din tabell ändras.
__________________
Full-stack developer, free for smaller assignments |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Flitig postare
|
Något i stil med detta, kanske:
Kod:
SELECT col1, col2, ..., -RAND()*UNIX_TIMESTAMP(PostDate) AS random_value FROM TestTable ORDER BY random_value ASC Annars kan du lösa det med lite kod i ditt favoritspråk. Ta ut ett slumptal, t.ex. mellan 2000 och 2013 (eller vad du nu har för årtal på raderna i databasen), och kör något i stil med: Kod:
SELECT col1, col2, ... FROM TestTable WHERE YEAR(PostDate) <= $slumptal ORDER BY RAND() |
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Flitig postare
|
|||
![]() |
![]() |
![]() |
#8 | ||||
|
|||||
Medlem
|
Tack för svaren
Citat:
Tex om jag gör 3st "brytpunkter" där jag väljer ut tex 100st rader av dom 33% äldsta raderna, 50st rader av 33% av dom mellersta raderna och 25st av dom 33% senaste raderna i databasen och därefter gör ett random urval på dom sammanställda raderna. Då är ju oddsen större att rand() tar någon av dom 100 äldsta än av dom 25st senaste, skall testa. Citat:
Citat:
Exempel 2 skulle nog inte fungera som tänkt för om jag slumpar ett årtal så kommer den bara hämta rader äldre/nyare än slumptalet, alltså alla 10 av dom raderna jag vill ha, men jag vill ha så att 2st av dom 10 skulle kunna vara bland dom 5 senaste raderna i tabellen, 2st i mitten av tabellen och 6st mot dom allra äldsta i tabellen. Citat:
|
||||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Administratör
|
En enkel lösning:
- Räkna antalet rader (select count(*) om du använder myisam, via cachad räknare om du använder innodb) - I ditt script vikta dina slumpnummer (Google: weighted random generator eller något i den stilen om du behöver en färdig algoritm) - Kör en select med order by PostDate och LIMIT på dina slumpnummer (Kontrollera huruvida du kan köra unions/subquerys och ändå använda index, med vanilla MySQL bör det nog vara bättre med en query per rad)
__________________
eldefors.com - Personlig (teknik)-blogg |
||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Supermoderator
|
Citat:
![]()
__________________
Full-stack developer, free for smaller assignments |
||
![]() |
![]() |
Svara |
|
|