[PHP/SQL] WHERE NOT EXISTS instructie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
jaja nu weet dat dit een zelfde titel is als een eerdere post uit 2001 :)
anyway heb dus weldegelijk gezicht naar een oplossing maar zelfs met behulp van de andere topics kon ik helaas geen resultaat boeken :(

uitleg:
nu is het de bedoeling dat ik een overzichtje maak van uitkeringen
deze uitkeringen hebben een gsm nummer.
daarnaast betstaat er een tabel met abonnementen en deze abonnementen hebben ook een gsm nummer
nu is het de bedoeling dat uitkeringen gekoppeld wordt dmv het abonnement id in de tabel uitkering
dit werkt goed maar nu kan het wel eens voorkomen dat een uitkering een foutief gsm nummer bevat
dit mag natuurlijk niet voorkomen en moet dus gecorrigeerd kunnen worden
vandaar dat er dus een overzicht moet komen van uitkeringen met de gsm-nummers EN dit nummer komt NIET voor in de tabel abonnement
hier de query die dus nog niet werkt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$zoekquery = mysql_query("  
SELECT 
    u.uitkering_gsm_nr
FROM 
    uitkering u
WHERE NOT EXISTS
    (
    SELECT * 
    FROM abonnement a 
    WHERE a.abonnement_gsm_nr = u.uitkering_gsm_nr)
    ");

nu zal er wel iets simpels en verkeerds zijn in mijn query maar ik kom er even zelf niet aan uit.
alvast bedankt voor de moeite :)

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SQL:
1
2
3
SELECT *
FROM uitkereing U
LEFT OUTER JOIN Abonnement A ON U.gms = A.gsm WHERE A,gsm IS NULL

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Wat werkt er niet dan? Welke foutmeldingen krijg je?
Welke versie van MySQL gebruik je?

Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
P_de_B schreef op vrijdag 11 augustus 2006 @ 11:09:
SQL:
1
2
3
SELECT *
FROM uitkereing U
LEFT OUTER JOIN Abonnement A ON U.gms = A.gsm WHERE A,gsm IS NULL
nee nu ga je ervan uit dat het gsmnumer bij het abonnement leeg maar dat klopt niet
het gsmnummer van de uitkering bestaat niet in de tabel abonnement ;)

Versie:
MySQL - 3.23.58
phpMyAdmin - 2.8.2

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Nee, wat P_de_B beschrijft is een rewrite van een not exists query, zoals beschreven in de manual. Jouw versie van MySQL ondersteunt geen subqueries.

Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
bigbeng schreef op vrijdag 11 augustus 2006 @ 11:22:
Nee, wat P_de_B beschrijft is een rewrite van een not exists query, zoals beschreven in de manual. Jouw versie van MySQL ondersteunt geen subqueries.
hmm geen subqueries das klote met de pet op dan :P

anyway hoe krijg ik dit dan voorelkaar want in mijn ogen klopt de query van P_de_B niet met dat wat ik wil hebben.
btw IS NULL lijkt me niet bepaald hetzelfde als NOt EXISTS ofwel :?

voorbeeld:
ik heb een uitkering met dit nummer: 0610-002752
en heb toevallig maar 2 abonnementen in het systeem staan met de gsm-nummers:
0681-586161
0616-986196

nu moet ik dus als resultaat deze uitkering krijgen met dit gsmnummer "0610-002752" omdat deze niet voorkomt in de tabel abonnementen...

edit:
het werkte wel alleen had ik domweg de (,) meegekopieerd -> moest een (.) zijn :)
thnx :)

[ Voor 9% gewijzigd door Tijgertje84 op 11-08-2006 11:31 ]

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik zal even uitleggen wat mijn query doet.

Stel je hebt de volgende gegevens:

Uitkeringen
GSM, Uitkering
06-12345678, 10
06-11111111, 20
06-22222222, 20

Abonnementen
GSM, Naam
06-12345678, Jantje
06-11111111, Pietje
06-33333333, Klaasje

Mijn query (zonder de WHERE) zegt eigenlijk, Toon alle rijen van de tabel uitkeringen, en toon overeenkomstige gegevens uit de tabel abonnementen. Toon wel rijen uit de tabel uitkeringen als er geen record in abonnementen zit. Als je een inner join zou hebben zouden alleen records die in beide tabellen zitten in de resultset voorkomen.

De query zonder where levert dus op

U.GSM, U.Uitkering, A.GSM, A.Naam
06-12345678, 10 , 06-12345678, Jantje
06-12345678, 20 , 06-12345678, Pietje
06-22222222, 20, NULL, NULL

De NULL waardes in het laatste record komen omdat er voor GSM nr 06-22222222 geen overeenkomstige record in tabel abonnement zit. BIj een OUTER JOIN krijg je dan NULLs terug.

Door nu in de WHERE clausule op te nemen dat A.GSM NULL moet zijn, krijg je alle records uit Uitkeringen terug, die geen bijbehorend record in Abonnementen hebben.

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
ok tjah duidelijker kan niet :)
misschien komt het omdat ik niet zo into the JOINS ben
weet veel van SQL maar die JOINS blijven voor mij vaak nog beetje lastig zeker die INNER en OUTER LEFT en RIGHT joins :)
maar bedankt voor de duidelijke uitleg :)

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Nog een handige link dan: Hoe werken joins?

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Geen idee of dit werkt:

SQL:
1
2
SELECT *
FROM uitkereing u WHERE u.gms NOT IN (SELECT a,gsm FROM abonnement a)

[ Voor 3% gewijzigd door XWB op 11-08-2006 12:00 ]

March of the Eagles


Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
Hacku schreef op vrijdag 11 augustus 2006 @ 12:00:
Geen idee of dit werkt:

SQL:
1
2
SELECT *
FROM uitkereing u WHERE u.gms NOT IN (SELECT a,gsm FROM abonnement a)
nee zie deze post:
bigbeng schreef op vrijdag 11 augustus 2006 @ 11:22:
Jouw versie van MySQL ondersteunt geen subqueries.
dus helaas geen subqueries voor mij :)
natuurlijk zal het wel werken maar als subqueries zouden werken dan was mijn query ook al goed geweest :)

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H

Pagina: 1