Gå til innhold

Finne alle rader som _ikke_ har FK i annen tabell


Anbefalte innlegg

Hei

 

Har to tabeller (MySQL med MyIsam) (her med de viktigste feltene):

 

tblPerson:

  • ID - Autonummer
  • Fornavn - Varchar
  • Etternavn - Varchar

tblResultat:

  • ID - Autonummer
  • Tid - Dato
  • RitterFK - ID til personen fra tblPerson.

Alle personer har 1 rad i tblPerson.

I tblResultat ligger alle resultat, det kan være flere resultat per RitterFK(tblPerson.ID).

 

Det er også en del personer i tblPerson som ikke har noen resultat i tblResultat. Det jeg trenger er å finne alle rader i tblPerson som ikke har resultat i tblResultat.

 

Det er ca 10,000 rader i tblPerson og 50,000 i tblResultat.

 

Noen som har noe triks? Har prøvd meg på en liten join, men det tar så lang tid jeg bare får timeout i phpMyAdmin.

Lenke til kommentar
Videoannonse
Annonse

Slik gjør jeg det i access iallfall.. kanskje det hjelper?

 

tblperson_tblresultat.PNG

 

SELECT tblPerson.ID, tblResultat.RitterFK
FROM tblPerson LEFT JOIN tblResultat ON tblPerson.ID = tblResultat.RitterFK
WHERE (((tblResultat.RitterFK) Is Null));

Lenke til kommentar
Slik gjør jeg det i access iallfall.. kanskje det hjelper?

 

tblperson_tblresultat.PNG

 

SELECT tblPerson.ID, tblResultat.RitterFK
FROM tblPerson LEFT JOIN tblResultat ON tblPerson.ID = tblResultat.RitterFK
WHERE (((tblResultat.RitterFK) Is Null));

 

 

Hei

 

Var noe i den duren jeg har kjørt selv, men grunnet mengden med data (50,000 rader som skal joines på 10,000 rader) ser det ut som MySQL serveren min sliter litt (bruker forresten cliche.no, noen som har opplevd problemer med store spørringer der?).

Lenke til kommentar

Måten nevnt ovenfor er måten det normalt gjøres på. Hvis det går for tregt mangler du kanskje indeks på FK? Alternativt så har serveren det kjøres på for lite ram / for høy load pga andre oppgaver.

 

Sjekket på databaseserveren på jobben og spørringen tar ca 1 sek hvis den returnerer 50000 rader og noen millisekunder hvis den skal returnere 500 rader. (Det er på postgresql 8.3)

Endret av blackbrrd
Lenke til kommentar
SELECT tblPerson.ID, tblResultat.RitterFK
FROM tblPerson LEFT JOIN tblResultat ON tblPerson.ID = tblResultat.RitterFK
WHERE (((tblResultat.RitterFK) Is Null));

 

Alternativt noe slikt som:

 

select p.id
from person p
where not exists (select null from resultat r where r.ritter_fk = p.id)

 

At jeg velger NULL fra underspørringen er bare en konvensjon; samme hva resultatet er, vi vil bare (ikke) ha en rad.

Lenke til kommentar
EXISTS har ihvertfall postgresql hatt problemer med å optimize riktig, selv om resultatet burde vært prikk likt på join/exists... :o)

Njah.. Jeg tilgir planneren for å ikke se at left join + where right pk/fk is null egentlig burde være not exits. ;)

Endret av Frank2004
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...