Ik wil graag een record ophalen uit een tabel maar dat afhankelijk is van een ander record in dezelfde tabel. Hoe doe ik dat?

SELECT iets
FROM tabel
WHERE veld1='waarde1'

maar dan mag een ander record in dezelfde tabel geen
veld2='waarde2'
hebben.
Omdat je het over twee records doet, zal je een self join moeten toepassen. Op dit moment weet ik alleen niet op welke grond je het 'andere' record selecteert, dus dat is vast nog even voor verbetering vatbaar:

SELECT a.iets
FROM tabel a
LEFT JOIN tabel b ON b.id = xxx
WHERE a.veld1='waarde1'
  AND b.veld2 <> 'waarde2'

De selectie die ik dus niet weet op dit moment betreft dat wat in de ON clause van de JOIN staat.
Ik heb al iets gevonden:

SELECT iets
FROM tabel
WHERE veld1='waarde1'
AND (SELECT iets FROM tabel WHERE veld1='waarde2' AND veld2<>'waarde2')

Bedankt voor het meedenken.
Die if()-pagina van Koen ga ik even goed bekijken want er valt nog wel wat te verbeteren.

SanThe.
Die if kan je niet gebruiken omdat het over meerdere records in dezelfde tabel gaat. Je hebt dus altijd een self join of een subquery nodig.

Ik vraag me alleen af wat jij nu doet of het werkt. Heb je dat getest?
Die query werkt maar voldoet niet aan wat ik zocht. Ik heb het nu opgelost met twee query's en dat werkt exact zoals ik wil. Het staat in een stukje code dat zeer zelden wordt gebruikt dus een query meer maakt daar niet echt uit.
Het kan toch het beste met 1 query+subquery. Geen data processen in php dus. Helaas wordt er hier vaak nogal spastisch gedaan over subquery's. Een subquery met een NOT EXISTS is feitelijk de aangewezen oplossing. Ik gebruik het regelmatig op zeer grote databases en met de juiste indexing gaat dit goed.


Jammer maar helaas.
Als we het over mysql hebben is een WHERE NOT EXISTS subquery nooit de aangewezen oplossing!!
En met zeer grote databases ga je zeker geen mysql gebruiken.
Ger van Steenderen op 25/09/2013 21:58:30

Jammer maar helaas.
Als we het over mysql hebben is een WHERE NOT EXISTS subquery nooit de aangewezen oplossing!!
En met zeer grote databases ga je zeker geen mysql gebruiken.
Ik moet inderdaad bekennen dat ik weinig mysql gebruik. Ik gebruik WHERE NOT EXISTS veelvuldig, indien nodig, in Oracle(11G) Echter ook in MySQL kan een WHERE NOT EXISTS efficient werken wanneer het 'gezochte dat niet mag bestaan' een geindexeerde column is en dan bij voorkeur een unique indexed, toch? Ik ben benieuwd waarom je van mening bent dat het in MySQL echt niet kan.

Omdat dit in MySQL altijd een full table scan tot gevolg heeft, ongeacht of je nu een extra filter in de hoofdquery hebt staan. Het wordt zelfs in de MySQL manual zelf aangekaart.

Maar het is wel MySQL specifiek, want ook in SQL Server kan je zonder probleem (is zelfs beter) NOT EXISTS subqueries toepassen.

Daarom mag er ook wel spastisch gedaan worden over subqueries, ik vermijd ze daar waar mogelijk
@Ger, dank voor je toelichting. Weer wat geleerd over MySQL

Reageren