Avatar billede truelz Nybegynder
29. juli 2006 - 20:00 Der er 17 kommentarer og
1 løsning

SQL - Kombineret LEFT JOIN og WHERE

Jeg vil gerne hente alle rækker fra tabellen felter, hvor betingelserne er opfyldt, men MySQL returnerer kun de rækker, hvor der er en værdi til kolonnen tekster.tekst.
Hvis jeg fjerner WHERE delen, virker sætningen som den skal (altså hvor den returnerer alt for mange rækker, men i så fald returnerer den også de rækker hvor der ikke er en værdi til tekster.tekst kolonnen.
Det er IKKE den her "tekster.bruger = 1" der gør det, det er så snart der står noget i WHERE delen.

SELECT felter.id, felter.navn, felter.fasttekst, felter.side, tekster.tekst
FROM
felter
LEFT JOIN tekster ON felter.id = tekster.felt
WHERE felter.afdeling = 26 AND not felter.laast = 1 AND tekster.bruger = 1
ORDER BY felter.side, felter.id

Jeg kan ikke finde en kategori der omhandler SQL, så jeg opretter spørgsmålet her, da SQL-sætningen dannes af et ASP script.
Avatar billede keysersoze Ekspert
29. juli 2006 - 20:26 #1
har du også prøvet at gøre din where-statement med KUN felter.afdeling = 26, med KUN not felter.laast = 1 og med KUN tekster.bruger = 1?

For mig at se er der ikke umiddelbart noget der ellers ville kunne gøre det du beskriver.
Avatar billede truelz Nybegynder
29. juli 2006 - 20:32 #2
Ja, så snart jeg har så meget som en eneste betingelse med, går det galt. Og det er ligemeget om den tilhører tabellen tekster eller felter.
Avatar billede keysersoze Ekspert
29. juli 2006 - 20:39 #3
kan du udskrive en side vi kan se hvor du ingen where-statements har men også udskriver felter.afdeling, felter.laest samt tekster.bruger?
Avatar billede truelz Nybegynder
29. juli 2006 - 20:50 #4
mysql> SELECT felter.id, felter.navn, tekster.tekst FROM felter LEFT JOIN tekster ON felter.id = tekster.felt WHERE felter.afdeling = 26 AND not felter.laast = 1 AND tekster.bruger = 1 ORDER BY felter.side, felter.id;
+--+--+--+
| id | navn | tekst |
+--+--+--+
| 47 | Navn| Troels Jessen|
| 48 | Titel| Lærling|
| 49 | Mail| xxxx|
| 50 | Privat, gade| Langgade 1|
| 51 | Privat, by| Aalborg|
| 53 | Mobil| 0000|
+--+--+--+
6 rows in set

mysql> SELECT felter.id, felter.navn, tekster.tekst FROM felter LEFT JOIN tekster ON felter.id = tekster.felt ORDER BY felter.side, felter.id;
+--+--+------+
| id | navn | tekst    |
+--+--+------+
| 1 | Navn| NULL |
| 3 | Tlf| NULL |
| 4 | Fornavn| NULL |
| 5 | Efternavn| NULL |
| 6 | Telefon| NULL |
| 8 | Navn| NULL |
| 9 | Titel| NULL |
| 10 | Dir. tlf. | NULL |
| 11 | Mobil| NULL |
| 12 | E-mail| NULL |
| 13 | Navn| NULL |
| 14 | Titel| NULL |
| 15 | Mobil| NULL |
| 16 | E-mail| NULL |
| 19 | Navn| NULL |
| 20 | Titel| NULL |
| 21 | adr., tlf. og fax| NULL |
| 22 | Mobil| NULL |
| 23 | Mail| NULL |
| 24 | www| NULL |
| 30 | www| NULL |
| 31 | Navn| Helle Christensen|
| 31 | Navn| Troels Jessen|
| 32 | Titel| Programmør|
| 32 | Titel| Printoperatør|
| 33 | Mobil| 1111|
| 33 | Mobil| 0000|
| 34 | Mail| yyyy|
| 34 | Mail| xxxx|
| 35 | Navn| NULL |
| 36 | Titel| NULL |
| 37 | Mobil| NULL |
| 38 | Mail| NULL |
103 rows in set

Den sidste er et uddrag.
Avatar billede truelz Nybegynder
29. juli 2006 - 20:53 #5
mysql> SELECT felter.id, felter.navn FROM felter WHERE afdeling = 26 AND not felter.laast = 1 ORDER BY felter.side, felter.id;
+--+--+
| id | navn |
+--+--+
| 47 | Navn|
| 48 | Titel|
| 49 | Mail|
| 50 | Privat, gade|
| 51 | Privat, by|
| 52 | Privat, tlf|
| 53 | Mobil|
+--+--+
7 rows in set

Det er disse syv rækker den gerne skulle spytte ud med i sidste ende, men hvor den så putter kolonnen tekst på, og udfylder den hvis muligt, ellers bare lader den være tom, som i eksemplet uden WHERE klausulen.
Avatar billede keysersoze Ekspert
29. juli 2006 - 21:40 #6
du glemte også at udskrive; felter.afdeling, felter.laest, tekster.bruger

;)
Avatar billede truelz Nybegynder
29. juli 2006 - 21:49 #7
Nåh, den kommer lige.
Igen et uddrag

mysql> SELECT felter.id, felter.navn, felter.fasttekst, felter.side, tekster.tekst, felter.afdeling, felter.laast, tekster.bruger FROM felter LEFT JOIN tekster ON felter.id = tekster.felt ORDER BY felter.side, felter.id;
+--+--+--+--+------+--+--+------+
| id | navn | fasttekst | side | tekst    | afdeling | laast | bruger    |
+--+--+--+--+------+--+--+------+
| 1 | Navn|  | 0 | NULL | 2 | 0 | NULL |
| 3 | Tlf|  | 0 | NULL | 2 | 0 | NULL |
| 4 | Fornavn|  | 1 | NULL | 9 | 0 | NULL |
| 5 | Efternavn|  | 1 | NULL | 9 | 0 | NULL |
| 29 | Mail|  | 1 | NULL | 19 | 0 | NULL |
| 30 | www|  | 1 | NULL | 19 | 1 | NULL |
| 31 | Navn|  | 1 | Helle Christensen| 20 | 0 |    38 |
| 31 | Navn|  | 1 | Troels Jessen| 20 | 0 |    30 |
| 32 | Titel|  | 1 | Programmør| 20 | 0 |    30 |
| 32 | Titel|  | 1 | Printoperatør| 20 | 0 |    38 |
| 33 | Mobil| Mobil +45 | 1 | 1111| 20 | 0 |    38 |
| 33 | Mobil| Mobil +45 | 1 | 0000| 20 | 0 |    30 |
| 34 | Mail|  | 1 | yyyy| 20 | 0 |    38 |
| 34 | Mail|  | 1 | xxxx| 20 | 0 |    30 |
| 35 | Navn|  | 1 | NULL | 22 | 0 | NULL |
| 36 | Titel|  | 1 | NULL | 22 | 0 | NULL |
| 37 | Mobil| Mobil +45 | 1 | NULL | 22 | 0 | NULL |
| 38 | Mail|  | 1 | NULL | 22 | 0 | NULL |
| 39 | Navn|  | 1 | NULL | 23 | 0 | NULL |
| 40 | Titel|  | 1 | NULL | 23 | 0 | NULL |
| 41 | Mobil| Mobil +45 | 1 | NULL | 23 | 0 | NULL |
| 42 | Mail|  | 1 | NULL | 23 | 0 | NULL |
| 43 | Navn|  | 1 | NULL | 25 | 0 | NULL |
| 44 | Titel|  | 1 | NULL | 25 | 0 | NULL |
| 45 | Mobil| Mobil +45 | 1 | NULL | 25 | 0 | NULL |
| 46 | Mail|  | 1 | NULL | 25 | 0 | NULL |
| 47 | Navn|  | 1 | Troels Jessen| 26 | 0 |    1 |
| 47 | Navn|  | 1 | Linda| 26 | 0 |    21 |
| 48 | Titel|  | 1 | Lærling| 26 | 0 |    1 |
| 48 | Titel|  | 1 | Grafiker| 26 | 0 |    21 |
| 49 | Mail|  | 1 | yyyy| 26 | 0 |    21 |
| 49 | Mail|  | 1 | xxxx| 26 | 0 |    1 |
| 50 | Privat, gade|  | 1 | Grøftekanten 12| 26 | 0 |    21 |
| 50 | Privat, gade|  | 1 | Langgade 1| 26 | 0 |    1 |
| 51 | Privat, by|  | 1 | 9300 Sæby| 26 | 0 |    21 |
| 51 | Privat, by|  | 1 | Aalborg| 26 | 0 |    1 |
| 52 | Privat, tlf| Telefon: | 1 | 2048 58| 26 | 0 |    21 |
| 53 | Mobil| Mobil: | 1 | 0000| 26 | 0 |    1 |
| 54 | Navn|  | 1 | NULL | 27 | 0 | NULL |
| 55 | Titel|  | 1 | NULL | 27 | 0 | NULL |
| 105 | Mail|  | 1 | NULL | 35 | 0 | NULL |
| 106 | Privat, gade|  | 1 | NULL | 35 | 0 | NULL |
| 107 | Privat, by|  | 1 | NULL | 35 | 0 | NULL |
| 108 | Privat, tlf| Telefon: | 1 | NULL | 35 | 0 | NULL |
| 109 | Mobil| Mobil: | 1 | NULL | 35 | 0 | NULL |
| 110 | Navn|  | 1 | NULL | 36 | 0 | NULL |
| 111 | Titel|  | 1 | NULL | 36 | 0 | NULL |
| 112 | Mail|  | 1 | NULL | 36 | 0 | NULL |
| 113 | Privat, gade|  | 1 | NULL | 36 | 0 | NULL |
| 114 | Privat, by|  | 1 | NULL | 36 | 0 | NULL |
| 115 | Privat, tlf| Telefon: | 1 | NULL | 36 | 0 | NULL |
| 116 | Mobil| Mobil: | 1 | NULL | 36 | 0 | NULL |
| 145 | Navn|  | 1 | NULL | 41 | 0 | NULL |
| 146 | Titel|  | 1 | NULL | 41 | 0 | NULL |
| 147 | Mail|  | 1 | NULL | 41 | 0 | NULL |
| 148 | Privat, gade|  | 1 | NULL | 41 | 0 | NULL |
| 149 | Privat, by|  | 1 | NULL | 41 | 0 | NULL |
| 150 | Privat, tlf| Telefon: | 1 | NULL | 41 | 0 | NULL |
| 151 | Mobil| Mobil: | 1 | NULL | 41 | 0 | NULL |
| 7 | Privattlf| Privat tlf.:| 2 | NULL | 9 | 0 | NULL |
| 17 | Fornavn|  | 25 | NULL | 6 | 0 | NULL |
| 18 | Efternavn|  | 25 | NULL | 6 | 0 | NULL |
+--+--+--+--+------+--+--+------+
159 rows in set
Avatar billede truelz Nybegynder
29. juli 2006 - 21:49 #8
Men det er altså ikke det der er galt, lad mig sige... Det er ikke den første SQL sætning jeg har skrevet, og jeg tror nok jeg har været inde i problemet før, men hvor jeg fik mig kringlet udenom.
Avatar billede keysersoze Ekspert
29. juli 2006 - 23:51 #9
er det korrekt forstået, at det du mangler at få ud er den række med ID = 52? Hvis det er korrekt så kunne jeg godt tænke mig at se hele dit sidst resultat (evt bare link til en txt-fil) - for som jeg ser det ud fra det uddrag du har postet giver SQL'en det korrekte resultat ud fra where-delen.
Avatar billede truelz Nybegynder
30. juli 2006 - 10:08 #10
Det er korrekt. Du får resultatet, men hvis du mener du kan lave det, kan du også få adgang til at forespørge på tabellen?

http://bke.mikrosites.dk/dbudtrak.txt
Avatar billede keysersoze Ekspert
30. juli 2006 - 10:27 #11
men - jeg kan bare ikke helt se hvorfor du forventer også at trække denne ud;

| 52 | Privat, tlf|

?
Avatar billede truelz Nybegynder
30. juli 2006 - 10:33 #12
mysql> SELECT felter.id, felter.navn, tekster.tekst FROM felter LEFT JOIN tekster ON felter.id = tekster.felt WHERE felter.afdeling = 26 AND not felter.laast = 1 AND tekster.bruger = 1 ORDER BY felter.side, felter.id;
+--+--+--+
| id | navn | tekst |
+--+--+--+
| 47 | Navn| Troels Jessen|
| 48 | Titel| Lærling|
| 49 | Mail| xxxx|
| 50 | Privat, gade| Langgade 1|
| 51 | Privat, by| Aalborg|
| 53 | Mobil| 0000|
+--+--+--+
6 rows in set

mysql> SELECT felter.id, felter.navn FROM felter WHERE afdeling = 26 AND not felter.laast = 1 ORDER BY felter.side, felter.id;
+--+--+
| id | navn |
+--+--+
| 47 | Navn|
| 48 | Titel|
| 49 | Mail|
| 50 | Privat, gade|
| 51 | Privat, by|
| 52 | Privat, tlf|
| 53 | Mobil|
+--+--+
7 rows in set

Vi er vist enige om at det øverste udtræks oplysninger skal kombineres med det nederste udtræks rækker.

Jeg bruger en LEFT JOIN, og så vidt jeg ved er det en form for OUTER JOIN, derfor ville jeg mene at den skulle tage alle felter fra felter-tabellen der opfylder betingelserne. Tager jeg fejl?
Avatar billede keysersoze Ekspert
30. juli 2006 - 10:55 #13
jo - men id 52 opfylder jo heller ikke betingelsen idet den ikke har en ' tekster.bruger = 1'. Det er derfor jeg ikke helt kan forstå hvorfor du skriver dette i dit spørgsmål 'Det er IKKE den her "tekster.bruger = 1" der gør det' for som jeg ser det er det den der giver dig det ene mindre resultat.
Avatar billede truelz Nybegynder
30. juli 2006 - 11:03 #14
mysql> SELECT felter.id, felter.navn, tekster.tekst FROM felter LEFT JOIN tekster ON felter.id = tekster.felt WHERE felter.afdeling = 26 AND not felter.laast = 1 ORDER BY felter.side, felter.id;
+--+--+--+
| id | navn | tekst |
+--+--+--+
| 47 | Navn| Troels Jessen|
| 47 | Navn| Linda|
| 48 | Titel| Lærling|
| 48 | Titel| Grafiker|
| 49 | Mail| yyyy|
| 49 | Mail| xxxx|
| 50 | Privat, gade| Grøftekanten 12|
| 50 | Privat, gade| Langgade 1|
| 51 | Privat, by| 9300 Sæby|
| 51 | Privat, by| Aalborg|
| 52 | Privat, tlf| 0000|
| 53 | Mobil| 0000|
+--+--+--+
12 rows in set

Det kan vi da heldigvis rimelig nemt komme ud over :)

Nu begynder det at hjælpe. Her er ID 52 med, men jeg tænkte det var fordi der var en post i tekster der svarede til den. Så den har jeg slettet.
Så så det sådan ud:

mysql> SELECT felter.id, felter.navn, tekster.tekst FROM felter LEFT JOIN tekster ON felter.id = tekster.felt WHERE felter.afdeling = 26 AND not felter.laast = 1 ORDER BY felter.side, felter.id;
+--+--+------+
| id | navn | tekst    |
+--+--+------+
| 47 | Navn| Troels Jessen|
| 47 | Navn| Linda|
| 48 | Titel| Lærling|
| 48 | Titel| Grafiker|
| 49 | Mail| yyyy|
| 49 | Mail| xxxx|
| 50 | Privat, gade| Grøftekanten 12|
| 50 | Privat, gade| Langgade 1|
| 51 | Privat, by| 9300 Sæby|
| 51 | Privat, by| Aalborg|
| 52 | Privat, tlf| NULL |
| 53 | Mobil| 0000|
+--+--+------+
12 rows in set

Og så begynder det at ligne noget. Men så håbede jeg man kunne gøre sådan:

mysql> SELECT felter.id, felter.navn, tekster.tekst FROM felter LEFT JOIN tekster ON felter.id = tekster.felt WHERE felter.afdeling = 26 AND not felter.laast = 1 AND (tekster.bruger = 1 OR tekster.bruger = NULL) ORDER BY felter.side, felter.id;
+--+--+--+
| id | navn | tekst |
+--+--+--+
| 47 | Navn| Troels Jessen|
| 48 | Titel| Lærling|
| 49 | Mail| xxxx|
| 50 | Privat, gade| Langgade 1|
| 51 | Privat, by| Aalborg|
| 53 | Mobil| 0000|
+--+--+--+
6 rows in set
Avatar billede keysersoze Ekspert
30. juli 2006 - 11:13 #15
kan ikke helt huske MySQL-syntaks men måske nærmere dette;

SELECT felter.id, felter.navn, tekster.tekst FROM felter LEFT JOIN tekster ON felter.id = tekster.felt WHERE felter.afdeling = 26 AND not felter.laast = 1 AND (tekster.bruger = 1 OR tekster.bruger IS NULL) ORDER BY felter.side, felter.id;
Avatar billede truelz Nybegynder
30. juli 2006 - 19:49 #16
Nåja, det hedder nok LIKE NULL, jeg vil lige prøve det når jeg kommer hjem.
Avatar billede truelz Nybegynder
30. juli 2006 - 20:44 #17
Du havde fuldstændig ret, jeg skulle bruge IS. Smider du lige et svar så jeg kan komme af med nogle points? Tak for hjælpen.
Avatar billede keysersoze Ekspert
30. juli 2006 - 21:18 #18
selvfølgelig :)
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
Kurser inden for grundlæggende programmering

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