Uitvoeren van een join query
Ik ben op dit moment een oud programmaatje wat intern draait aan het (proberen) te repareren. Het is aardig oud (nog gemaakt in cobalt) en de database is niet echt 'optimaal'. Ik kom niet uit 1 query wat mij redelijk simpel lijkt maar toch niet werkt. Ik heb de volgende database opzet.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
tbl_bedrijf_enter
bedrijf_id int
bedrijf_naam varchar(50)
bedrijf_adres varchar(500)
tbl_bedrijf_gecert
bedrijf_id int
gecert_id int
tbl_gecert
gecert_id int
gecert_naam varchar(30)
gecert_sub_naam varchar(30)
gecert_port varchar(30)
?>
tbl_bedrijf_enter
bedrijf_id int
bedrijf_naam varchar(50)
bedrijf_adres varchar(500)
tbl_bedrijf_gecert
bedrijf_id int
gecert_id int
tbl_gecert
gecert_id int
gecert_naam varchar(30)
gecert_sub_naam varchar(30)
gecert_port varchar(30)
?>
In principe is de opzet dus simpel. Een bedrijf kan meerdere gecert hebben (zijn een soort van speciale nummers) de gecerts worden gekoppeld aan bedrijven door middel van de koppeltabel tbl_bedrijf_gecert.
Nu is in tbl_gecert het mogelijk dat de volgende datarijen aanwezig zijn (als voorbeeld)
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
gecert_id gecert_naam gecert_sub_naam gecert_port
1 ty25 1 x23yi
2 ty25 2 xui34
3 ty28 1 yui23
4 ty28 2 yui11
5 ty28 3 yui90
6 ty30 1 a33ab
6 ty30 2 a3312
?>
gecert_id gecert_naam gecert_sub_naam gecert_port
1 ty25 1 x23yi
2 ty25 2 xui34
3 ty28 1 yui23
4 ty28 2 yui11
5 ty28 3 yui90
6 ty30 1 a33ab
6 ty30 2 a3312
?>
Zoals te zien is is deze tabel niet optimaal. Als ik zelf zou beginnen zou ik gecert_naam in een aparte tabel hebben gezet en gecert_subnaam daaraan koppelen.. maar het is even niet anders(helaas).
Wat ik wil bereiken is bedrijven tonen die aan een aantal opgegeven gecert_naam bezitten. Dus bijvoorbeeld 'geef alle bedrijf_id die gecert_naam ty25 en ty30 bezitten
bedrijf_id gecert_naam
1 ty25
1 ty28
1 ty30
Wat mijn oplossing dan was, was om het met de volgende query te doen:
Code (php)
Dit geeft alleen 0 resultaten terug. Ik denk dat het komt door de tabel opzet maar ik heb geen idee hoe ik het anders zou moeten opvragen.
Ik weet dat dit een lange post is maar zou iemand mij hiermee kunnen helpen? Alvast bedankt.
Oplossing:
Selecteer alle rijen uit je tbl_gecert tabel die aan ofwel de ene naam voldoen, ofwel aan de andere. Selecteer daarop dan de bedrijf ids die twee rijen in de resultset hebben:
Code (php)
1
2
3
4
5
2
3
4
5
SELECT bedrijf_id
FROM tbl_gecert
WHERE g.gecert_naam = 'ty25' OR g.gecert_naam = 'ty30'
GROUP BY bedrijf_id
HAVING count(*) = 2;
FROM tbl_gecert
WHERE g.gecert_naam = 'ty25' OR g.gecert_naam = 'ty30'
GROUP BY bedrijf_id
HAVING count(*) = 2;
Vervolgens kan je hier dan nog andere gegevens aan joinen als je wilt (dit wordt dan een subquery om de bedrijfs ids te selecteren).
Toevoeging op 27/08/2013 15:29:28:
Hallo,
Ik ben nog even bezig geweest maar het is mogelijk dat de volgende gegevens in de database staan:
3 ty28 1 yui23
4 ty28 2 yui11
5 ty28 3 yui90
dan krijg ik dus 3 rijen met ty28 terwijl dat bedrijf ty30 niet heeft. Maar met de query wordt dat bedrijf wel getoond omdat er dus wel 3 rijen met hem zijn.
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
b.bedrijf_id,
b.bedrijf_naam
FROM
(SELECT DISTINCT bc.bedrijf_id, c.gecert_naam
FROM tbl_bedrijf_gecert bc, tbl_gecert c
WHERE
bc.gecert_id = c.gecert_id
AND c.gecert_naam IN ('ty28','ty30')
) sq
INNER JOIN
tbl_bedrijf_enter b
USING (bedrijf_id)
GROUP BY bedrijd_id, bedrijf_naam,
HAVING COUNT(*) = 2
b.bedrijf_id,
b.bedrijf_naam
FROM
(SELECT DISTINCT bc.bedrijf_id, c.gecert_naam
FROM tbl_bedrijf_gecert bc, tbl_gecert c
WHERE
bc.gecert_id = c.gecert_id
AND c.gecert_naam IN ('ty28','ty30')
) sq
INNER JOIN
tbl_bedrijf_enter b
USING (bedrijf_id)
GROUP BY bedrijd_id, bedrijf_naam,
HAVING COUNT(*) = 2
Gewijzigd op 27/08/2013 16:54:58 door Ger van Steenderen
Woo bedankt, als ik morgen weer op werk ben ga ik het direct uitproberen.
Ben even verder gegaan hiermee en het werkt bedankt!. Nu moet ik nog wat extra condities en dergelijke toevoegen maar met dit als voorbeeld kom ik er denk ik wel uit.