Goedendag allen,
Onlangs ben ik aan de gang gegaan met temporary tables in MySQL. Dit in het kader van het optimaliseren van een bestaande query voor een genealogie programma waar ik mee bezig ben.
Doel
Families isoleren die aan niemand gekoppeld zijn.
Probleem stelling
Het programma heeft een tabel genaam families en ziet er zo uit:
f_husb is het ID van de man in de vorm van I10, f_wife is het ID van de vrouw in de vorm van I10, f_chil is het ID van het kind/kinderen in de vorm van I10;I11; en f_file is het ID van de gebruikte stamboom.
De volgende query heb ik gemaakt:
Dit is de query als een familie 2 kinderen heeft. Mochten er meer kinderen zijn dan wordt de query aangevuld door de PHP code met:
Het getal 2 wordt dan opgehood met 1, dit net zoveel unions als er kinderen zijn. De query wordt tweemaal uitgevoerd om 2 tijdelijke tabellen te krijgen, te weten temp_fama en temp_famb. Nu ik mijn 2 tabellen heb, wil ik weten welke personen in temp_fama eenmaal voorkomen in temp_famb. Dit om families te isoleren die aan niemand gelinkt zijn. Hier loop ik vast
De volgende query heb ik geprobeerd:

Vraag
Wat ik dus wil weten is welke personen in temp_fama eenmaal voorkomen in temp_famb. Waar ga ik fout in mijn bovenstaande query
Hartelijk dank.
RolandD
Onlangs ben ik aan de gang gegaan met temporary tables in MySQL. Dit in het kader van het optimaliseren van een bestaande query voor een genealogie programma waar ik mee bezig ben.
Doel
Families isoleren die aan niemand gekoppeld zijn.
Probleem stelling
Het programma heeft een tabel genaam families en ziet er zo uit:
code:
1
2
3
4
5
6
7
| f_id | varchar(255) f_file | int(11) f_husb | varchar(255) f_wife | varchar(255) f_chil | text f_gedcom | text f_numchil | int(11) |
f_husb is het ID van de man in de vorm van I10, f_wife is het ID van de vrouw in de vorm van I10, f_chil is het ID van het kind/kinderen in de vorm van I10;I11; en f_file is het ID van de gebruikte stamboom.
De volgende query heb ik gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| CREATE TEMPORARY TABLE IF NOT EXISTS temp_fama SELECT f_id AS family, f_husb AS member, 'H' AS type FROM gm_families WHERE f_file='3' AND f_husb != '' UNION SELECT f_id AS family, f_wife AS member, 'W' AS type FROM gm_families WHERE f_file='3' and f_wife != '' UNION SELECT f_id AS family, SUBSTRING_INDEX( f_chil, ';', 1 ) AS member, 'C' AS type FROM gm_families WHERE f_file='3' and f_chil != '' AND SUBSTRING_INDEX( f_chil, ';', 1 ) != '' UNION SELECT f_id AS family, SUBSTRING_INDEX(SUBSTRING_INDEX( f_chil, ';', 2 ) , ';' , -1 ) AS member, 'C' AS type FROM gm_families WHERE f_file='3' AND f_chil != '' AND SUBSTRING_INDEX(SUBSTRING_INDEX( f_chil, ';', 2 ) , ';' , -1 ) != '' |
Dit is de query als een familie 2 kinderen heeft. Mochten er meer kinderen zijn dan wordt de query aangevuld door de PHP code met:
code:
1
2
3
4
5
6
7
8
| UNION SELECT f_id AS family, SUBSTRING_INDEX(SUBSTRING_INDEX( f_chil, ';', 2 ) , ';' , -1 ) AS member, 'C' AS type FROM gm_families WHERE f_file='3' AND f_chil != '' AND SUBSTRING_INDEX(SUBSTRING_INDEX( f_chil, ';', 2 ) , ';' , -1 ) != '' |
Het getal 2 wordt dan opgehood met 1, dit net zoveel unions als er kinderen zijn. De query wordt tweemaal uitgevoerd om 2 tijdelijke tabellen te krijgen, te weten temp_fama en temp_famb. Nu ik mijn 2 tabellen heb, wil ik weten welke personen in temp_fama eenmaal voorkomen in temp_famb. Dit om families te isoleren die aan niemand gelinkt zijn. Hier loop ik vast
De volgende query heb ik geprobeerd:
code:
Hier krijg ik dan de error dat er een fout in mijn query zit in de buurt van de 1e WHERE. Hoe ik ook schommel met de haakjes, de melding blijft hetzelfde. Deze query op gewone tabellen werkt wel. 1
2
3
4
5
6
| SELECT temp_fama.*, temp_famb.* FROM temp_fama, temp_famb WHERE ( SELECT b.* FROM temp_famb b WHERE b.member=temp_fama.member AND b.family != temp_fama.family) LIMIT 3 |
Vraag
Wat ik dus wil weten is welke personen in temp_fama eenmaal voorkomen in temp_famb. Waar ga ik fout in mijn bovenstaande query
Hartelijk dank.
RolandD