[SQL] Voorwaarde in query

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • renevanh
  • Registratie: Juli 2006
  • Laatst online: 23-08 20:02
code:
1
'SELECT T1.begin, T1.eind, T2.tekst, T3.naam FROM gebouw AS T1, commentaar AS T2, heilige AS T3 WHERE T1.heilige = T3.idheilige AND T1.referenties_id = T2.referenties_id AND T1.heilige = :consecid AND T1.gebouw = :gebouwid'


(De variabelen consecid en gebouwid komen via een Ajax call aan en zijn integers)

Het probleem: soms is er geen veld in de tabel commentaar (T2) wat gekoppeld is aan het referenties_id in T1. Er is dan vaak wel weer een referenties_id in T1, maar de voorwaarde "AND T1.referenties_id = T2.referenties_id" geeft dus geen resultaat (oftewel NULL), wat betekend dat de hele query NULL teruggeeft. Hierdoor komt andere data (die dan wel getoond moet worden) ook niet te voorschijn. Dat moet, ook bij het ontbreken van commentaar, wel gebeuren.
Inconsistente database van een klant, niet ideaal :P

Ik heb in SQL (betreft een MySQL database) al zitten vogelen met de IFNULL() maar krijg daar geen werkende oplossing voor elkaar. De COALESCE() functie krijg ik niet helemaal doorgrond maar lijkt in dit geval ook niet de ideale oplossing.

Iemand tips?

[ Voor 4% gewijzigd door renevanh op 10-05-2015 16:35 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:12

Creepy

Tactical Espionage Splatterer

Dat klinkt alsof je een LEFT OUTER JOIN wilt gebruiken: Programming FAQ - SQL - Hoe werken joins

[ Voor 8% gewijzigd door Creepy op 10-05-2015 16:37 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • EvilWhiteDragon
  • Registratie: Februari 2003
  • Laatst online: 11-09 12:12
Kan je niet iets doen in de trans van
code:
1
AND (T1.referenties_id = T2.referenties_id OR T2.referenties_id IS NULL)

LinkedIn
BlackIntel


Acties:
  • 0 Henk 'm!

  • renevanh
  • Registratie: Juli 2006
  • Laatst online: 23-08 20:02
Ik denk dat dat idee goed is EvilWhiteDragon, maar in je voorbeeldcode zoek je naar T2.referenties_id IS NULL, dus naar velden in T2, kolom referenties_id die leeg zijn. Die bestaan niet ;)
Het resultaat van T1.referenties_id = T2.referenties_id is NULL, want de overeenkomende T2.referenties_id bestaat niet. In T1.referenties_id staat wel een getal, iemand heeft daar niet zo handig zitten knippen denk ik :(

Met een left join zou je volgens mij krijgen:

code:
1
SELECT T1.begin, T1.eind, T2.tekst, T3.naam FROM heilige AS T3, gebouwwijding AS T1 LEFT JOIN commentaar AS T2 ON (T1.referenties_id = T2.referenties_id) WHERE T1.heilige = T3.idheilige AND T1.heilige = :consecid AND T1.gebouw = :gebouwid


Helaas werkt dat niet, query geeft nog steeds helemaal niks terug.

[ Voor 31% gewijzigd door renevanh op 10-05-2015 16:52 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:12

Creepy

Tactical Espionage Splatterer

renevanh: aangezien je uit meerdere tabellen tegelijk selecteert komt daar wel degelijk NULL uit. Wat EWD daar beschrijft in SQL is een LEFT OUTER JOIN. Lees aub dat stukje FAQ's over joins eens door wat ik net linkte.

Laat T3 ook nog even volledig weg zodat je rustig met twee tabellen kan testen. Breidt dat dan uit met je derde tabel en maak daar ook een echte join van.

[ Voor 26% gewijzigd door Creepy op 10-05-2015 16:54 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • renevanh
  • Registratie: Juli 2006
  • Laatst online: 23-08 20:02
De eerste door mij gepostte code met de LEFT JOIN erin werkt wel, deze jongen moet even opletten dat ie bij het testen geldige ID's gebruikt en ze ook niet omwisselt bijvoorbeeld 8)7

[ Voor 200% gewijzigd door renevanh op 10-05-2015 17:14 ]


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Schrijf een JOIN altijd (!!!) uit als een JOIN. Daarmee wordt je code overzichtelijker, maar kun je ook eenvoudig switchen van een (INNER) JOIN naar een LEFT JOIN of RIGHT JOIN. In jouw geval lijk je een LEFT JOIN nodig te hebben:
SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT 
  T1.begin, 
  T1.eind, 
  T2.tekst, 
  T3.naam 
FROM gebouw AS T1, 
  LEFT JOIN commentaar AS T2 ON T1.referenties_id = T2.referenties_id
  JOIN heilige AS T3 ON T1.heilige = T3.idheilige
WHERE
  T1.heilige = :consecid 
AND T1.gebouw = :gebouwid;
Pagina: 1