Dubbele resultaten bij inner join en null waardes

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • nowherebound123
  • Registratie: Mei 2009
  • Laatst online: 19-09 21:54
Heren,

Ik heb een probleempje met de volgende query. Het is de bedoeling dat er stageplaatsen uit een database worden opgehaald met de volgende query:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT
            
s.stageID,
s.stageBedrijfID,
s.stageNaam,
s.stageActiviteiten,
s.stageNiveau,
s.stageSector,
s.stageAantal,
s.stageBegint,
s.stageEindigt,
b.bedrijfID,
b.bedrijfNaam,
b.bedrijfPlaats
                                        
FROM stagemanagement_stages as s, stagemanagement_bedrijven AS b
                            
WHERE s.stageBedrijfID = b.bedrijfID
                            
AND s.stageNiveau LIKE '%".$_SESSION["gebruikerNiveau"]."%'
                            
AND s.stageSector LIKE '%".$_SESSION["gebruikerSector"]."%'
            
AND s.stageBegint > NOW() OR s.stageBegint IS NULL;


Dit gaat in principe goed zolang ik de laatste regel weg laat, deze dus:

code:
1
AND s.stageBegint > NOW() OR s.stageBegint IS NULL;


Wanneer ik die er echter wel bij zet krijg ik 6 resultaten terug terwijl er maar 3 records in de tabel staan, en de gegevens zijn dan ook nog eens door elkaar gegooid.

Heeft iemand enig idee waar dat aan kan liggen?

Stagebegint is een timestamp veld en kan een datum of een null waarde bevatten.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Kijk eens goed naar je haakjes. Je hebt geen explicitiete join conditie (daar heb je het JOIN keyword voor) maar je zet de join conditie los in je where. Wat rechts van je OR staat wordt helemaal los bekeken (dus s.stageBedrijfID = b.bedrijfID heeft daarop geen invloed) dus je JOIN doet op dat moment niks.

Zeer waarschijnlijk wil je
AND (s.stageBegint > NOW() OR s.stageBegint IS NULL);

[ Voor 13% gewijzigd door Creepy op 27-05-2009 13:30 ]

"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!

  • nowherebound123
  • Registratie: Mei 2009
  • Laatst online: 19-09 21:54
Creepy schreef op woensdag 27 mei 2009 @ 13:29:
Kijk eens goed naar je haakjes. Je hebt geen explicitiete join conditie (daar heb je het JOIN keyword voor) maar je zet de join conditie los in je where. Wat rechts van je OR staat wordt helemaal los bekeken (dus s.stageBedrijfID = b.bedrijfID heeft daarop geen invloed) dus je JOIN doet op dat moment niks.

Zeer waarschijnlijk wil je

[...]
Wanneer ik de door jou gesuggereerde code toevoeg krijg ik alleen de records terug waar stageBegint gelijk is aan NULL, maar niet de records waarin stageBegint een datum bevat die nog niet geweest is. Dat is wel de bedoeling.

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 14:57

Dido

heforshe

wat voor data staat er in stageBegint?

Je gebruikt geen haakjes en geen expliciete join condition. Dat kan goed gaan, maar ik denk dat je nu het volgende selecteert:

SQL:
1
2
select blaat from A, B
where (A.id = B.id AND begint > X) OR (begint is NULL)

terwijl wat je bedoelt is
SQL:
1
2
select blaat from A, B
where (A.id = B.id) AND (begint > X OR begint is NULL)


Sowieso is het handig om je joinconditie expliciet te benoemen, dus
SQL:
1
2
select blaat from A join B on A.id = B.id
where begint > X OR begint is NULL


edit: precies wat creepy zegt, dus.

Je moet zijn "code" niet toevoegen, maar een paar haakjes ;)

Je hebt het over records met stageBegint gevuld en records waar dat veld NULL is. En er zijn maar drie records. Dat kan niet, dus ik denk dat je wat nuttige informatie achterhoudt ;)

[ Voor 21% gewijzigd door Dido op 27-05-2009 13:37 ]

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • nowherebound123
  • Registratie: Mei 2009
  • Laatst online: 19-09 21:54
De haakjes hebben toch gewerkt, ik heb het nu zoals ik wilde.

Bedankt.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

edit: precies wat creepy zegt, dus.
:P
nils.kuijpers schreef op woensdag 27 mei 2009 @ 13:36:
De haakjes hebben toch gewerkt, ik heb het nu zoals ik wilde.

Bedankt.
Maar snap je nu ook waarom of niet?

"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!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Los van and/or precedence en haakjes:
Schrijf aub het type join expliciet met de join voorwaarde (ON of USING clause) er direct bij. Joins met de ','-operator zijn bad practice. Het type join is onduidelijk (een komma is minder duidelijk dan iets als INNER JOIN) en de precedence is anders tov de andere join types. Dat laatste is een behoorlijk instinker en heeft tevens bij de introductie van mysql 5 een brekende wijziging ondergaan.

{signature}


Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 15:38

remco_k

een cassettebandje was genoeg

Misschien is het ook handig om even in te lezen in sql injection voorkomen.
Hoewel ik met mijn boeren PHP kennis niet helemaal zeker weet of sql injection ook mogelijk is met $_SESSION. Maar het lijkt me van wel.

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Klopt, je moet in de directe context zien dat je goed zit, dus hier moet je hoe dan ook escapen. Als je vertrouwt op de manier waarop de sessie vars geset worden kan je wachten op een moment van falen, en escape je ook niet in de juiste context.

{signature}

Pagina: 1