Visa ett inlägg
Oläst 2014-03-13, 15:47 #8
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
Tack för svaren


Citat:
Ursprungligen postat av Johnny Viking Visa inlägg
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.
Jao det skulle nog gå rätt bra ja, om jag tänker rätt dvs. Går ju lösa enkelt på min 2 olika sätt i MySQL, antingen med subqueries eller med UNION.

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:
Ursprungligen postat av tartareandesire Visa inlägg
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.
Skulle helst inte vilja ha ett viktningsfält då det ökar komplexiten ett redan komplext script & vill helst undvika småupdates så mycket det går då jag kör databasen på ett par SSD:er. Skulle iofs kunna skapa en dedikerad MEMORY tabell just för viktningen så är de ju inget problem egentligen. Sliter ju inte överdrivet extra att göra en update på alla rader en gång om dagen men ändå, varje liten grej för att förlänga livslängden på SSD:erna



Citat:
Ursprungligen postat av HenrikAI Visa inlägg
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
Vet inte hur bra det är rent prestandamässigt dock.

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()
Hmm, första exemplet vet jag inte riktigt hur det fungerar, ser inte huruvida den lägger extra vikt på äldre eller inte, skall testa.

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:
Ursprungligen postat av Nerix Visa inlägg
Tack men tror inte att WITH fungerar eller har någon motsvarighet i MySQL och exemplet har ett viktningsfält vilket jag helst skulle vilja slippa om det är möjligt.
JesperA är inte uppkopplad   Svara med citatSvara med citat