Avatar billede mobildata Nybegynder
29. maj 2006 - 17:33 Der er 4 kommentarer og
1 løsning

joine 2 tabeller

Jeg har rodet en del med denne forespørgsel uden held.

jeg har 2 tabeller den ene hedder Salg og den anden hedder Users
I tabellen Salg ligger "user" og "dato". I tabellen Users ligger navn.

Salg  Users
----  -----
user  navn
dato


Tabellen Users-navn indeholder alle brugernavne.
Tabellen Salg indeholder en entry hvor gang en bruger er logget ind med dato.

f.eks bruger1021    2006-12-24

Nu vil jeg gerne sammenligne disse 2 tabeller og finde ud af hvilke brugere (fra Users) der "ikke" var logget ind en given dato (fra Salg).

Så hvis jeg f.eks har en brugerliste på 50 i Users
og der er 2 der har været logget ind på en given dato
skal output være de 48 brugere der ikke har være logget ind den angivne dato.

jeg har prøvet noget i retning af nedenstående i flere forskellige afskygninger uden held.

SELECT navn FROM Users LEFT JOIN Salg ON navn=user WHERE user IS NULL LEFT JOIN Salg ON dato WHERE dato = '2006-12-24'
Avatar billede pidgeot Nybegynder
29. maj 2006 - 22:59 #1
Hvis du har 4.1 eller senere burde du kunne bruge denne:

SELECT navn FROM Users WHERE navn NOT IN (SELECT user FROM Salg WHERE dato='2006-12-24');

hvilket jeg umiddelbart vil mene kan omskrives til dette, såfremt en join er nødvendig:

SELECT navn FROM Users LEFT JOIN Salg ON navn=user WHERE dato='2006-12-24' AND user IS NULL;

Bemærk dog at denne omskrivning ikke er testet!
Avatar billede mobildata Nybegynder
29. maj 2006 - 23:11 #2
Mit udbyder har desværre ikke opgraderet til 4.1  :-(

Jeg har også prøvet:

SELECT navn FROM Users LEFT JOIN Salg ON navn=user WHERE dato='2006-12-24' AND user IS NULL;

Som foreslået, men jeg får ingen fejl men derimod blank side...
og der er masser i databasen at tage fra.
Avatar billede pidgeot Nybegynder
30. maj 2006 - 02:15 #3
Nej, jeg kan godt se den ikke virker efter hensigten - det er nok den ekstra betingelse der gør det...

Jeg er ikke sikker på den sådan lige er til at skrive om fra den subselect - men du kan jo evt. vælge at dele det op i to forespørgsler, en til at hente de ID'ere der er, og en anden der så sætter dem ind i stedet for subselecten i en kommaseparert liste...

Dvs. den første query ville se sådan ud:

SELECT user FROM salg WHERE dato='2006-12-24';

og hvis denne returnerede bruger 1, 2 og 3, ville den anden forespørgsel så se sådan ud:

SELECT navn FORM Users WHERE navn NOT IN (1,2,3);

såfremt det der gemmes i Salg er et tal - ellers skal du huske at de skal skrives som strings: NOT IN ('1','2','3')

Jeg smider et svar som du kan bruge hvis du vil - men for min skyld må du gerne lade spørgsmålet stå et par dage og se om der er en eller anden der har en bedre ide :)
Avatar billede mobildata Nybegynder
30. maj 2006 - 09:14 #4
jeg kan ikke bruge "NOT IN" men jeg må splitte det op i 2 query´s og sammenligne dem bagefter. måske med php. jeg accepterer dit svar, Mange Tak!!
Avatar billede pidgeot Nybegynder
30. maj 2006 - 10:58 #5
Lige til din orientering: Du kan godt bruge NOT IN sålænge du selv udfylder ID'erne - i hvert fald i MySQL 4.0.
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