Avatar billede htx98i17 Professor
06. juli 2003 - 15:30 Der er 5 kommentarer og
1 løsning

Select giver for mange poster

ved en mysql_num_rows() på denne sql, giver resultatet 1149041. Men det er altså meningen at resultatet kun skal give 26.

SELECT tbl1.id FROM tbl1, tbl2 WHERE tbl1.id NOT IN (tbl2.id)

Den tager en hulens lang tid at køre og giver et resultat på alt for mange poster. Hvis jeg derimod kører:

SELECT tbl1.id FROM tbl1, tbl2 WHERE tbl1.id  IN (tbl2.id)

... altså uden "NOT" - så tager det kort tid og returnerer selvfølgelig de id's fra tbl1 som ER i tbl2.

Så mit spørgsmål er: Hvorfor faen kan den ikke finde ud af det, når jeg tilføjer "NOT" ?

Det er lidt pinligt faktisk. Jeg har brugt mysql i 3 år nu og er stadig på top10 kan jeg se :-) Men det her problem er jeg åbenbart ikke stødt på før.
Avatar billede arne_v Ekspert
06. juli 2003 - 15:53 #1
Altså lad os sige at tbl1 indeholder 1,2,3 og tbl2 indeholder 2,3,4 !

Sp vil tbl1,tbl2 indeholder:

1 2
1 3
1 4
2 2
2 3
2 4
3 2
3 3
3 4

WHERE tbl1.id  IN (tbl2.id) vil selecte:
2 2
3 3
altså 2 rækker som du forventer.

WHERE tbl1.id NOT IN (tbl2.id) vil selecte:

1 2
1 3
1 4
2 3
2 4
3 2
3 4
altså 7 rækker i.s.f. den ene række du nok forventer.
Avatar billede htx98i17 Professor
06. juli 2003 - 15:58 #2
hmm ja det kan jeg faktisk godt se nu.

Men hvorn skal man så lave den?
Avatar billede arne_v Ekspert
06. juli 2003 - 16:29 #3
Hvis det ikke var MySQL så var det jo:

SELECT id
FROM tbl1
WHERE id NOT IN (SELECT id FROM tbl2)

men medmindre du er på version 4.1, så kan du ikke det.

MySQL forslår selv (http://www.mysql.com/doc/en/ANSI_diff_Sub-selects.html):

SELECT tbl1.id
FROM tbl1 LEFT JOIN tbl2 ON tbl1.id=tbl2.id                                     
WHERE tbl2.id IS NULL;

så prøv det !
Avatar billede arne_v Ekspert
06. juli 2003 - 16:32 #4
tbl1 LEFT JOIN tbl2 ON tbl1.id=tbl2.id  skulle så give:
1 NULL
2 2
3 3
og WHERE tbl2.id IS NULL skulle så udvælge den ene
rigtige row.

Teorien ser OK ud.
Avatar billede arne_v Ekspert
06. juli 2003 - 16:32 #5
Og så vil jeg tillade mig at ligge et svar.
Avatar billede htx98i17 Professor
06. juli 2003 - 16:35 #6
Ja der var den sq! Joinen virkede. versionen er 3.24 deromkring...

Jeg takker for hjælpen. Lig et svar hvis du vil have points
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