Heey,
Ik moet op mijn werk een aardig ingewikkelde query maken (ingewikkeld op mijn SQL kennis niveau) en het is me zelfs bijna gelukt maar nog niet helemaal.
Oke de query moet het volgende resultaat laten zien:
Hij moet alle relaties uit het relatie tabel afgaan, en kijken of die relatie een partner heeft. Als een relatie een partner heeft dan moet hij de gegevens van die partner op dezelfde rij zetten. Indien een relatie geen partner heeft hoort hij hem toch te selecteren maar de partner waarden moeten dan "NULL" zijn.
Oke tot zover is het mij gelukt, en het resultaat mag er wezen. Nu kwam mijn baas, dat hij alle relaties wilt en indien aanwezig een partner welke kinderen hebben. Hoe kan je zien of een relatie een kind heeft, dit kun je zien aan het veld oid1 en oid2 (Ouder Id 1/2). Deze velden verwijzen namelijk naar een relatie welke dus de ouder en of verzorger is van die relatie (kind).
Nu dacht ik dus aan een JOIN waarbij alle relaties die geen kind hebben weg moet laten vallen, echt ben ik hier nog niet in geslaagd en vraag ik om jullie hulp.
Nog even een opmerking, waarschijnlijk ga ik klachten van jullie krijgen over het tabel ontwerp. Ik geef jullie groot gelijk maar het huidige design is ontworpen door iemand die hier werkte 4 jaar geleden.. en dacht niet echt vooruit. Nu zijn we 4 jaar verder en is het tabel al gevult met ruim 10.000 records.
Oke we hebben de volgende query welke alle relaties selecteerd inclusief partner: (deze werkt wel goed execution time +- 0.07... seconden.)
Maargoed wij willen alleen mensen die samen een kindje hebben gebaart
dus ik wat expirimenteren:
Ik dacht dus dat je een voorwaarde kon hangen aan een JOIN, maar als ik deze query excute loopt mysql helemaal vast. Dus waarschijnlijk is de relatie onderling niet goed ofzo.
Ik heb ook nog geprobeer een having aan te maken met een count op kinderen (in een subquery) maar dat wou ook niet werken.
Ik heb niet zoveel verstand van joins.. ben er over ana het lezen maar het is moeilijk te bevatten.
Maar is er iemand die mij een tip kan geven, of misschien weet wat ik niet goed doe?
Ik moet op mijn werk een aardig ingewikkelde query maken (ingewikkeld op mijn SQL kennis niveau) en het is me zelfs bijna gelukt maar nog niet helemaal.
Oke de query moet het volgende resultaat laten zien:
Hij moet alle relaties uit het relatie tabel afgaan, en kijken of die relatie een partner heeft. Als een relatie een partner heeft dan moet hij de gegevens van die partner op dezelfde rij zetten. Indien een relatie geen partner heeft hoort hij hem toch te selecteren maar de partner waarden moeten dan "NULL" zijn.
Oke tot zover is het mij gelukt, en het resultaat mag er wezen. Nu kwam mijn baas, dat hij alle relaties wilt en indien aanwezig een partner welke kinderen hebben. Hoe kan je zien of een relatie een kind heeft, dit kun je zien aan het veld oid1 en oid2 (Ouder Id 1/2). Deze velden verwijzen namelijk naar een relatie welke dus de ouder en of verzorger is van die relatie (kind).
Nu dacht ik dus aan een JOIN waarbij alle relaties die geen kind hebben weg moet laten vallen, echt ben ik hier nog niet in geslaagd en vraag ik om jullie hulp.
Nog even een opmerking, waarschijnlijk ga ik klachten van jullie krijgen over het tabel ontwerp. Ik geef jullie groot gelijk maar het huidige design is ontworpen door iemand die hier werkte 4 jaar geleden.. en dacht niet echt vooruit. Nu zijn we 4 jaar verder en is het tabel al gevult met ruim 10.000 records.
Oke we hebben de volgende query welke alle relaties selecteerd inclusief partner: (deze werkt wel goed execution time +- 0.07... seconden.)
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| -- DEZE Query Selecteerd alle record, gooit partners bij elkaar -- en selecteerd alleen natuurlijke personen SELECT relatie.sorteerveld AS relatie_achternaam, relatie.straat AS relatie_straat, relatie.huisnummer AS relatie_huisnummer, relatie.postcode AS relatie_postcode, relatie.woonplaats AS relatie_woonplaats, partner.sorteerveld AS partner_achternaam, partner.straat AS partner_straat, partner.huisnummer AS partner_huisnummer, partner.postcode AS partner_postcode, partner.woonplaats AS partner_woonplaats, relatie.pid AS partnerid FROM klant AS relatie LEFT JOIN klant AS partner ON ((relatie.pid = partner.id) ) WHERE (relatie.id < relatie.pid OR relatie.pid IS NULL) AND (relatie.oid1 IS NULL AND relatie.oid2 IS NULL) AND (partner.oid1 IS NULL AND relatie.oid2 IS NULL) AND relatie.soort = "0" AND partner.soort = "0" AND relatie.cpbedrid IS NULL AND partner.cpbedrid IS NULL ORDER BY partner_achternaam DESC |
Maargoed wij willen alleen mensen die samen een kindje hebben gebaart
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| relatie.pid AS partnerid FROM klant AS relatie LEFT JOIN klant AS partner ON ((relatie.pid = partner.id) AND ((exists( SELECT oid1 FROM klant WHERE oid1 IN (relatie.pid,relatie.id) )) OR (exists( SELECT oid2 FROM klant WHERE oid2 IN (relatie.pid,relatie.id) )) ) ) WHERE (relatie.id < relatie.pid OR relatie.pid IS NULL) AND (relatie.oid1 IS NULL AND relatie.oid2 IS NULL) AND (partner.oid1 IS NULL AND relatie.oid2 IS NULL) |
Ik dacht dus dat je een voorwaarde kon hangen aan een JOIN, maar als ik deze query excute loopt mysql helemaal vast. Dus waarschijnlijk is de relatie onderling niet goed ofzo.
Ik heb ook nog geprobeer een having aan te maken met een count op kinderen (in een subquery) maar dat wou ook niet werken.
Ik heb niet zoveel verstand van joins.. ben er over ana het lezen maar het is moeilijk te bevatten.
Maar is er iemand die mij een tip kan geven, of misschien weet wat ik niet goed doe?