29. juli 2006 - 20:00Der 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.
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.
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.
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.
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?
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.
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
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;
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.