[Mysql] Selecteren wat niet gelijk is

Pagina: 1
Acties:

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06-2025

Gerwin

Ik ben er klaar voor!

Topicstarter
De volgende drie tabellen bestaan in mijn database:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Tabel 1:

ID int(8)
TEXT TEXT()
---------------------------------------
Tabel 2:

ID INT(8)
KOPID int(8)
--------------------------------------
Tabel 3
ID int(8)
KOPID int(8)
RECORD int(8)


Tabel 1 is een koppeltabel:
tabel1.ID = tabel2.ID

Tabel 2 is een koppeltabel:
tabel2.KOPID = tabel3.KOPID

Tabel 3 gebruik ik en nu wil ik een selectie doen op alle data waarvan ik in tabel 3 nog geen KOPID heb. Maar ik wil wel de data uit de koppeling tussen 1 en 2 hebben. Ik heb geprobeert het met een selectie ala SELECT tabel2.KOPID FROM tabel1, tabel2, tabel 3 WHERE tabel3.KOPID != tabel2.KOPID. Maar dan krijg ik dus ook niet de records terug uit de tweede tabel omdat er geen vergelijking is.

Mijn vraag is kort en bondig. Hoe kan ik met de data uit een veld van tabel 3 de data halen die niet gelijk is aan dat veld uit tabel 2 met een koppeling naar tabel 1?

[ Voor 7% gewijzigd door Gerwin op 13-07-2006 12:46 . Reden: code werd in smilie met zonnebril veranderd ]

Station van Gerwin Prins op Apple Music


  • DND_Roche
  • Registratie: Juli 2006
  • Laatst online: 02-01-2024
Ik zal je eerlijk zeggen dat ik je vraag niet helemaal begrijp maar ik denk dat je op zoek bent naar een not exists clausule

SQL:
1
2
3
4
5
6
7
8
Select *
  From tabel3
 Where Not Exists( Select 1
                     From tabel1
                        , tabel2
                    Where tabel1.id = tabel2.id
                      And tabel2.kopid = tabel3.kopid)
   And tabel3.bladiebla = :gegevenbladibla;

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 15-10-2025
Als jouw versie van MySql subselects ondersteunt, kun je zoiets doen:
SQL:
1
2
3
SELECT tabel1.*, tabel2.*
FROM tabel2
WHERE tabel1.ID = tabel2.ID AND tabel2.KOPID NOT IN (SELECT tabel3.KOPID FROM tabel3)

Don't be afraid of the dark, be afraid of what it hides


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Je moet een OUTER JOIN gebruiken. Om alle records in tabel A te krijgen die niet in tabel B zitten zou ik het volgende doen

SQL:
1
2
3
4
SELECT * 
FROM TabelA
LEFT OUTER JOIN TabelB ON A.Id = B.EenId 
WHERE B.EenId IS NULL -- alleen records selecteren die niet in B zitten

Snap je het principe?

edit:
zie ook Hoe werken Joins voor meer informatie over de verschillende join types.

[ Voor 21% gewijzigd door P_de_B op 13-07-2006 13:12 ]

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


  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 13:59
Als ik je hoed begrijp kan dat met een left join en dan een IS NULL clausule:
SQL:
1
2
3
SELECT * FROM `tb1` 
INNER JOIN `tb2` ON `tb1`.`id`= `tb2`.`id`
LEFT JOIN `tb3` ON (`tb2`.`id2` = `tb3`.`id` AND `tb3`.id IS NULL)


edit: what ^^^ said dus...

[ Voor 7% gewijzigd door T-MOB op 13-07-2006 13:14 ]

Regeren is vooruitschuiven


  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06-2025

Gerwin

Ik ben er klaar voor!

Topicstarter
Jongens, heel erg bedankt voor alle tips, ik ben echt verder gekomen na wat meer in joins verdiept te hebben. Er blijkt dus werkelijk nog een optie IS NULL te zijn. Ik heb nu via een LEFT JOIN alle tabellen aan elkaar gekoppeld en vervolgens gezegd dat iets tabel.veld IS NULL moet zijn, dan pakt hij hem wel het je moet inderdaad joinen omdat hij anders alleen de velden gebruikt die overeenkomen met de vergelijking en NULL is dan niets. Het artikel was P_de_B aanhaalde was zeer nuttig en waardevol voor mij ( Programming FAQ - SQL ).

Station van Gerwin Prins op Apple Music


  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06-2025

Gerwin

Ik ben er klaar voor!

Topicstarter
Er gaat toch nog iets niet helemaal goed dat terwijl ik toch dacht dat het wel werkte ik heb nu de volgende tabellen in de database.

Textcon
- Linx
- ID

Content
- Data
- Linx
- ID

In Textcon heb ik bepaalde zaken gekoppeld staan, beide velden zijn niet uniek en kan dus het volgende zijn:

Textcon
0001 - 00034
0001 - 00023
0002 - 00023
0003 - 00001

In de Content tabel heb ik vervolgens de data uit Textcon gekoppeld Data staat in dit voorbeeld voor extra velden maar niet komen de Linx uit Textcon en ID uit Textcon terug.

Ik heb nu het volgende gedaan:

SELECT
textcon.linx, textcon.id
FROM
textcon
LEFT JOIN content
ON(textcon.linx = content.linx)
WHERE
content.linx IS NULL

Ik krijg netjes een rij terug van de server, maar ik mis toch dingen. Zodra er namelijk één Linx gezet is pakt hij de volgende niet uit de textcon tabel. Zouden we van bovenstaande Textcon uitgaan dan krijg ik enkel de rows met een sterretje terug:

Textcon
0001 - 00034*
0001 - 00023
0002 - 00023*
0003 - 00001*

Doe ik het op de ID veld krijg ik ook slechts één 00023 terug

Textcon
0001 - 00034*
0001 - 00023*
0002 - 00023
0003 - 00001*

Wat ik wil is dat er op één of andere manier dubbel langs elkaar gelegd word en dat ik dus eigenlijk de combinatie van deze twee velden langs elkaar wil leggen.

Iets van:

SELECT
textcon.linx, textcon.id
FROM
textcon
LEFT JOIN content
ON(textcon.linx = content.linx)
ON(textcon.id = content.id)
WHERE
content.linx IS NULL

Maar dat gaat uiteraard niet zo. Kan iemand me een stukje op weg helpen?
----------

Toegevoegd:

Even voor de duidelijkheid data in tabellen is bijvoorbeeld:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Textcon

Linx | Id
0001 | 00023    
0001 | 00024
0001 | 00099 *   R
0002 | 00025
0003 | 00023 * L
0003 | 00024 * L
0004 | 00030 * L R

Content
Extra | Linx | Id
Blaat | 0001 | 00023
Blink | 0001 | 00024
Boom  | 0002 | 00025


Linx en Id zijn in beide tabellen aan elkaar gekoppeld. Maar ze zijn eigenlijk ook aan elkaar gekoppeld. Wat ik nu wil hebben is dat ik uit de tabel Textcon alle rijen wil weergeven waar de combinatie van Linx en Id uit de content tabel niet aanwezig is. In dit geval waar ik bij Textcon een sterretje achter de row heb staan.

Ik loop vast op het feit dat ik nadat bepaald is dat een Linx (of Id) al aanwezig is in Content ik dus helemaal de andere rijen van die niet terug krijg terwijl de Id (of Linx) wel anders is. Rijen met de L erachter krijg ik met Left Join terug met R op Right join.

[ Voor 23% gewijzigd door Gerwin op 15-07-2006 01:15 . Reden: vraag meer concreter gemaakt door toevoeging meer gegevens over situatie ]

Station van Gerwin Prins op Apple Music


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Je had 'm bijna goed
SQL:
1
2
3
4
5
6
7
8
SELECT
textcon.linx, textcon.id
FROM
textcon
LEFT JOIN content
ON(textcon.linx = content.linx AND textcon.id = content.id)
WHERE
content.linx IS NULL


btw. je kan een table een alias geven om de query korter te houden (vind ik persoonlijk praktischer)
SQL:
1
2
3
4
5
SELECT t.linx, t.id
FROM textcon t
LEFT JOIN content c
  ON (t.linx = c.linx AND t.id = c.id)
WHERE c.linx IS NULL

[ Voor 39% gewijzigd door Annie op 15-07-2006 13:06 ]

Today's subliminal thought is:


  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06-2025

Gerwin

Ik ben er klaar voor!

Topicstarter
Sorry, het werkt wel. :)

[ Voor 98% gewijzigd door Gerwin op 15-07-2006 18:28 . Reden: Sorry, het werkt wel. :) ]

Station van Gerwin Prins op Apple Music

Pagina: 1