Join Query dubbele personen
op het moment ben ik in gevecht met een query, waar ik op zich al aardig ver mee ben. Er is slechts één ding wat niet meewerkt: de filtering op personen. Ik zal proberen uit te leggen wat er aan de hand is. Ik probeer een overzicht te maken van gehouden momenten. Deze momenten zitten gekoppeld aan een sjabloon d.m.v. van een naam. Een resultaat wordt door een persoon opgeslagen.
Wat ik nu heb aan query:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
resultaat.resultaat_id as OverzichtId,
DATE_FORMAT(resultaat.resultaat_datum, '%d-%m-%Y') as OverzichtDatum,
sjabloon.sjabloon_naam as SjabloonNaam,
persoon.persoon_naam as PersoonNaam,
situatie.situatie_naam as SituatieRootNaam,
situatie.situatie_niveau as Niveau
FROM
resultaat JOIN situatie ON situatie.situatie_id = resultaat.situatie_koppel_id,
sjabloon,persoon
WHERE
persoon.persoon_naam = resultaat.persoon_naam_koppel_id AND
sjabloon_naam = (SELECT situatie_naam FROM situatie WHERE situatie_id = resultaat.situatie_koppel_id) OR
sjabloon_naam = (SELECT situatie_naam FROM situatie WHERE situatie_id = (SELECT situatie_parent_id FROM situatie WHERE situatie_id = resultaat.situatie_koppel_id))
resultaat.resultaat_id as OverzichtId,
DATE_FORMAT(resultaat.resultaat_datum, '%d-%m-%Y') as OverzichtDatum,
sjabloon.sjabloon_naam as SjabloonNaam,
persoon.persoon_naam as PersoonNaam,
situatie.situatie_naam as SituatieRootNaam,
situatie.situatie_niveau as Niveau
FROM
resultaat JOIN situatie ON situatie.situatie_id = resultaat.situatie_koppel_id,
sjabloon,persoon
WHERE
persoon.persoon_naam = resultaat.persoon_naam_koppel_id AND
sjabloon_naam = (SELECT situatie_naam FROM situatie WHERE situatie_id = resultaat.situatie_koppel_id) OR
sjabloon_naam = (SELECT situatie_naam FROM situatie WHERE situatie_id = (SELECT situatie_parent_id FROM situatie WHERE situatie_id = resultaat.situatie_koppel_id))
Er wordt een lijst weergegeven. Ook de juiste sjablonen, maar soms staat er een sjabloon 3x in. Dit is alleen van de 2e WHERE clause. Niet van de eerste. Hiervan worden 3 namen weergegeven. Terwijl er maar 1 persoon aan is gekoppeld. Wie weet hoe ik ik zorg dat er consistentie komt tussen het resultaat en de persoon die hier bij hoort?
En geef eens wat uitvoer weer.
Maak ook even duidelijk wat je precies wilt krijgen, mijn gevoel zegt dat je query onlogisch is maar ik wil graag eerst wat informatie hebben.
http://fotopocket.nl/view.php?friendly=1026134254
Wat ik graag wil is een overzicht van resultaten. Dus op datum met situatie, sjabloon en bijbehorend persoon.
Een resultaat staat bv zo in de db: "67 / 2011-10-26 11:04:26/ / NULL/0 /36"
Uitvoer wat ik krijg, is :
Datum Situatie Persoon Acties
26-10-2011 Situatieeen Gammele
26-10-2011 Situatietwee Gammele
26-10-2011 Situatietwee Vraal
26-10-2011 Situatietwee Jelle
26-10-2011 situatiezes Gammele
26-10-2011 Situatiedrie Gammele
26-10-2011 Situatiedrie Vraal
26-10-2011 Situatiedrie Jelle
26-10-2011 situatievijf Gammele
26-10-2011 situatievier Gammele
26-10-2011 situatievier Vraal
26-10-2011 situatievier Jelle
26-10-2011 Situatiedrie Gammele
26-10-2011 Situatiedrie Vraal
26-10-2011 Situatiedrie Jelle
25-10-2011 Situatietwee Gammele
25-10-2011 Situatietwee Vraal
25-10-2011 Situatietwee Jelle
Personen Vraal en Jelle zijn niet gekoppeld. De koppel_id komt niet overeen met de persoon_id. Toch staan ze er in. Het is zo dat: één, zes en vijf wel juist zijn. Alles van Gammele klopt. Maar Vraal en Jelle niet. Deze records zijn niet aangemaakt in de resultaten tabel. Er staan slechts 8 rows in de tabel resultaat, allen gekoppeld aan Gammele. Waarschijnlijk zit er een fail in de query.
Gewijzigd op 26/10/2011 14:07:56 door gammele vraal
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
resultaat.resultaat_id as OverzichtId,
DATE_FORMAT(resultaat.resultaat_datum, '%d-%m-%Y') as OverzichtDatum,
sjabloon.sjabloon_naam as SjabloonNaam,
persoon.persoon_naam as PersoonNaam,
situatie.situatie_naam as SituatieRootNaam,
situatie.situatie_niveau as Niveau
FROM
resultaat
JOIN situatie ON
situatie.situatie_id = resultaat.situatie_koppel_id,
JOIN persoon ON
persoon.id = resultaat.persoon_koppel_id
JOIN sjabloon ON
sjabloon.sjabloon_naam = situatie.situatie_naam;
resultaat.resultaat_id as OverzichtId,
DATE_FORMAT(resultaat.resultaat_datum, '%d-%m-%Y') as OverzichtDatum,
sjabloon.sjabloon_naam as SjabloonNaam,
persoon.persoon_naam as PersoonNaam,
situatie.situatie_naam as SituatieRootNaam,
situatie.situatie_niveau as Niveau
FROM
resultaat
JOIN situatie ON
situatie.situatie_id = resultaat.situatie_koppel_id,
JOIN persoon ON
persoon.id = resultaat.persoon_koppel_id
JOIN sjabloon ON
sjabloon.sjabloon_naam = situatie.situatie_naam;
Query draait wel, alleen worden er maar drie records weergegeven. De records die zeg maar geen parent hebben.
Volgens mij mis je het openingshaakje na de OR in de WHERE claus
TJVB je zat erg dichtbij heb de query verbouwd naar twee keer een inner join, één op persoon en één op de situatie. Bedankt!
Zou je die nieuwe query ook willen laten zien? Dat is dan ook leerzaam voor anderen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
resultaat.resultaat_id as OverzichtId,
DATE_FORMAT(resultaat.resultaat_datum, '%d-%m-%Y') as OverzichtDatum,
sjabloon.sjabloon_naam as SjabloonNaam,
persoon.persoon_naam as persoonNaam,
situatie.situatie_naam as SituatieRootNaam,
situatie.situatie_niveau as Niveau
FROM
sjabloon,resultaat
INNER JOIN situatie ON
situatie.situatie_id = resultaat.situatie_koppel_id
INNER JOIN persoon ON
persoon.persoon_id = resultaat.persoon_koppel_id
WHERE
resultaat.persoon_koppel_id IN (persoon.persoon_id ) AND
sjabloon_naam = (SELECT situatie_naam FROM situatie WHERE situatie_id = resultaat.situatie_koppel_id) OR
sjabloon_naam = (SELECT situatie_naam FROM situatie WHERE situatie_id = (SELECT situatie_parent_id FROM situatie WHERE situatie_id = resultaat.situatie_koppel_id))
resultaat.resultaat_id as OverzichtId,
DATE_FORMAT(resultaat.resultaat_datum, '%d-%m-%Y') as OverzichtDatum,
sjabloon.sjabloon_naam as SjabloonNaam,
persoon.persoon_naam as persoonNaam,
situatie.situatie_naam as SituatieRootNaam,
situatie.situatie_niveau as Niveau
FROM
sjabloon,resultaat
INNER JOIN situatie ON
situatie.situatie_id = resultaat.situatie_koppel_id
INNER JOIN persoon ON
persoon.persoon_id = resultaat.persoon_koppel_id
WHERE
resultaat.persoon_koppel_id IN (persoon.persoon_id ) AND
sjabloon_naam = (SELECT situatie_naam FROM situatie WHERE situatie_id = resultaat.situatie_koppel_id) OR
sjabloon_naam = (SELECT situatie_naam FROM situatie WHERE situatie_id = (SELECT situatie_parent_id FROM situatie WHERE situatie_id = resultaat.situatie_koppel_id))
Dit is werkend, weet alleen nog niet hoe ik kan filteren op een persoon.
Heb het nu als volgt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
resultaat.resultaat_id as OverzichtId,
DATE_FORMAT(resultaat.resultaat_datum, '%d-%m-%Y') as OverzichtDatum,
sjabloon.sjabloon_naam as SjabloonNaam,
persoon.persoon_naam as persoonNaam,
situatie.situatie_naam as SituatieRootNaam,
situatie.situatie_niveau as Niveau
FROM
sjabloon,resultaat
INNER JOIN situatie ON
situatie.situatie_id = resultaat.situatie_koppel_id
INNER JOIN persoon ON
persoon.persoon_id = resultaat.persoon_koppel_id
WHERE
resultaat.persoon_koppel_id IN (persoon.persoon_id ) AND
persoon.persoon_id = '".$filter."' AND
sjabloon_naam = (SELECT situatie_naam FROM situatie WHERE situatie_id = resultaat.situatie_koppel_id) OR
sjabloon_naam = (SELECT situatie_naam FROM situatie WHERE situatie_id = (SELECT situatie_parent_id FROM situatie WHERE situatie_id = resultaat.situatie_koppel_id))
resultaat.resultaat_id as OverzichtId,
DATE_FORMAT(resultaat.resultaat_datum, '%d-%m-%Y') as OverzichtDatum,
sjabloon.sjabloon_naam as SjabloonNaam,
persoon.persoon_naam as persoonNaam,
situatie.situatie_naam as SituatieRootNaam,
situatie.situatie_niveau as Niveau
FROM
sjabloon,resultaat
INNER JOIN situatie ON
situatie.situatie_id = resultaat.situatie_koppel_id
INNER JOIN persoon ON
persoon.persoon_id = resultaat.persoon_koppel_id
WHERE
resultaat.persoon_koppel_id IN (persoon.persoon_id ) AND
persoon.persoon_id = '".$filter."' AND
sjabloon_naam = (SELECT situatie_naam FROM situatie WHERE situatie_id = resultaat.situatie_koppel_id) OR
sjabloon_naam = (SELECT situatie_naam FROM situatie WHERE situatie_id = (SELECT situatie_parent_id FROM situatie WHERE situatie_id = resultaat.situatie_koppel_id))
Dan komen er weer resultaten van personen die ik niet heb geselecteerd.
Lastig hoor die JOIN query's. :/