30. august 2005 - 16:08Der 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 :(
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)
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 ..." :(
SELECT id, mail FROM Brugerdata AS A WHERE NOT EXISTS (SELECT brugerid FROM Afsendelse WHERE Afsendelse.brugerid = A.id AND Afsendelse.nyhedsbrevid=123);
SELECT Brugerdata.id, Brugerdata.mail FROM Brugerdata LEFT JOIN Afsendelse ON Brugerdata.id = Afsendelse.brugerid AND Afsendelse.nyhedsbrevid=123 WHERE Afsendelse.brugerid IS NULL
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....
(det er en kendt workaround for gamle MySQL versioner)
Synes godt om
Ny brugerNybegynder
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.