Avatar billede justask Nybegynder
30. august 2005 - 16:08 Der er 8 kommentarer og
1 løsning

NOT EXISTS eller IS NULL

Hej Experter

Jeg har to tabeller, en Brugerdata-tabel (id,navn,mail) og en Afsendelse-tabel der fortæller om brugeren har modtaget vores nyhedsbrev (brugerid,nyhedsbrevid). Nu vil jeg gerne vælge alle de brugere der _ikke_ har modtaget et bestemt nyhedsbrev. Pseudokoden er således

"SELECT id,mail FROM Brugerdata WHERE >id ikke findes i Afsendelse<"

Det er jo så den sidste del jeg ikke kan finde ud af. Så vidt jeg kan se bør man kunne bruge "NOT EXISTS(...)" med endnu en select indeni eller måske en left join med "IS NULL"?

Men som I kan forstå kan jeg ikke få nogen af dem til at virke  :(

(ps.: jeg bruger MySQL)

Takker
Avatar billede benneharli Juniormester
30. august 2005 - 16:10 #1
SELECT IndividualNdx
FROM RptIndividuals AS A
WHERE NOT EXISTS
(SELECT indivndx FROM events
WHERE eventtime BETWEEN '2005-04-01' AND '2005-04-16' AND (Pointaddr = 661 or Pointaddr = 645)
AND A.IndividualNdx = Events.IndivNdx)
Avatar billede benneharli Juniormester
30. august 2005 - 16:10 #2
Kan du bruge det til noget?
Avatar billede justask Nybegynder
30. august 2005 - 16:30 #3
Tak, men jeg får noget sql-fejl som jeg ikke kan tolke. Det jeg har skrevet er flg.:

SELECT id, mail FROM Brugerdata WHERE NOT EXISTS
(SELECT brugerid FROM Afsendelse
WHERE Afsendelse.brugerid = Brugerdata.id AND Afsendelse.nyhedsbrevid=123);

Den brokker sig over "syntax to use near 'EXISTS ( SELECT mr_newsletter_s_stat_sent.userid FROM mr_newsl ..."  :(
Avatar billede benneharli Juniormester
30. august 2005 - 16:53 #4
Prøv det her:

SELECT id, mail FROM Brugerdata AS A WHERE NOT EXISTS
(SELECT brugerid FROM Afsendelse
WHERE Afsendelse.brugerid = A.id AND Afsendelse.nyhedsbrevid=123);
Avatar billede arne_v Ekspert
30. august 2005 - 17:01 #5
hvilken version af MySQL ?

3.x og 4.0 understøtter ikke
  ... EXISTS (SELECT ...
det gør kun 4.1 (og 5.0)
Avatar billede justask Nybegynder
30. august 2005 - 17:16 #6
Hmm, jeg kører mysql version 4.0.18, måske det er der hunden ligger begravet....  :(
Avatar billede arne_v Ekspert
30. august 2005 - 17:26 #7
prøv:

SELECT Brugerdata.id, Brugerdata.mail
FROM Brugerdata LEFT JOIN Afsendelse ON Brugerdata.id = Afsendelse.brugerid AND Afsendelse.nyhedsbrevid=123
WHERE Afsendelse.brugerid IS NULL
Avatar billede justask Nybegynder
30. august 2005 - 17:55 #8
Den gør sq tricket  :D  og med et index på hhv. Afsendelse.nyhedsbrevid og Afsendelse.brugerid kører det endda hurtigt. Super-tak, hvis du lægger et svar, såe....
Avatar billede arne_v Ekspert
30. august 2005 - 17:56 #9
svar

(det er en kendt workaround for gamle MySQL versioner)
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