Avatar billede melange Nybegynder
15. april 2006 - 12:16 Der 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
Avatar billede arne_v Ekspert
15. april 2006 - 15:23 #1
nyere MySQL (4.1 elelr 5.0):

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
Avatar billede melange Nybegynder
15. april 2006 - 18:20 #2
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.
Avatar billede arne_v Ekspert
15. april 2006 - 23:49 #3
det kan du godt, men hvordan finder du så den række ?

ORDER BY id LIMIT 77132,1

?

(du skal ikke basere dig på at id er fortløbne, så nummer=id)

hvis det skal være hurtigt kunne du læse alle id'er op i et array
og trække et tilfældigt id derfra og så slå op med det id
Avatar billede erikjacobsen Ekspert
16. april 2006 - 00:08 #4
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.

Bare et par ideer. ;)
Avatar billede melange Nybegynder
21. april 2006 - 18:42 #5
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 :)
Avatar billede erikjacobsen Ekspert
21. april 2006 - 18:43 #6
Ingen point til mig, tak.  Det var ikke så meget "trafik" jeg tænkte på - mere generelt belastning på serveren og svartider.
Avatar billede arne_v Ekspert
21. april 2006 - 18:49 #7
p.g.a. det jeg skrev i parentesen

og svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester