15. april 2006 - 12:16Der er
6 kommentarer og 1 løsning
Findes ID i en anden tabel?
Jeg har to tabellen - en med en masse billeder, og en hvor der ligger nogle billeder som venter på at blive modereret. Jeg vil nu gerne hive et tilfældigt element ud af billedtabellen, hvor det gælder at billedet ikke ligger i modereringstabellen
Kort sagt:
SELECT images.id images.filename, images.sha, moderation.image_id FROM images, moderation WHERE images.id "does not exist in moderation.image_id AND images.id = $some_random_id_i_have_from_php
SELECT images.id, images.filename, images.sha FROM images WHERE images.id NOT IN (SELECT moderation.image_id FROM moderation) AND images.id = $x ORDER BY RAND() LIMIT 1
Ok - efter et export/import helvede fik jeg det til at virke. Eller det tror jeg da, nu er "images" nemlig ret stort, og "moderation" meget lille hvorfor det er lit svært at forudsige om den gør hvad den skal, men kører gør den :)
Men det bringer mig ind på et andet spørgsmål, som sagt er "images" en meget stor (~500.000 poster) tabel, og er så smart at køre ORDER BY RAND() på den? Så vidt jeg erorienteret kører ORDER BY RAND() i linær tid hvorimod man i konstant tid kan hive antallet af elementer ud og "manuelt" beregne et tilfældigt id.
Lad os da lige prøve at vende den her i luften et par gange.
1) Vel er det muligt at få de godkendte billeder med en subselect (måske også med en join), men det er ikke nødvendigvis en specielt billig operation. Hvad med at tilføje billederne et felt, der siger om de er godkendte til visning. Så skal du kun tjekke i een tabel. Det er ganske vist at tilføje redundans, men det kan være en god idé. Sommetider.
2) Jo, det er kostbart at finde et tilfældigt billede ud af en halv million. Hvis du har trafik af betydning - og mon ikke, når du har så mange billeder - bliver du nødt til at omdefinere dit problem. Du ønsker at vise forskellige billeder hver gang man kommer på siden, men ikke nødvendigvis valgt ud fra alle de mulige. En skitse: Hver time kører du et cron-job, der vælger 1000 billeder ud tilfældigt, sådan ca. som anført her. I den efterfølgende time vises så eet af disse billeder tilfældigt. Du behøver ikke nødvendigvis bruge en database til dette - måske er det hurtigere at generere en tekstfil, læse den ind, og vælge. Eller måske en includefil til PHP. er hastighed vigtigt er der altså flere muligheder. Måske kan du tillade dig at bruge mere tid på at vælge de 1000 billeder - fx så en del af dem altid er blandt de nyeste billeder.
arne_v: kunne man ikke bare sige noget i retningen af. WHERE id >= 12345 LIMIT 1, men nok om det :) dit første bud virkede fint så snart jeg fik konverteret til MySQL 5, hastigheden på siden er stadig fin, og jeg har andre ting som skal laves først :)
erik: Jo, jeg betaler selv for trafik, og det lød faktisk som en rigtig god ide med at "cache" et par billeder, og vise dem.
men jeg fik vist det jeg kom efter, så hvis folk der mener de har fortjent point lige smider et svar :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.