Uitvoeren van een join query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ama saril

ama saril

27/08/2013 11:50:48
Quote Anchor link
Hallo mensen van phphulp.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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)
?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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
?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
SELECT b.bedrijf_id, c.gecert_naam FROM tbl_bedrijf_enter be JOIN tbl_bedrijf_gecert bg ON be.bedrijf_id = bg.bedrijf_id JOIN tbl_gecert g ON bg.gecert_id = g.gecert_id WHERE g.gecert_naam = 'ty25' AND g.gecert_naam = 'ty30' GROUP BY g.gecert_naam
?>


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.
 
PHP hulp

PHP hulp

21/11/2024 20:44:36
 
Erwin H

Erwin H

27/08/2013 12:26:57
Quote Anchor link
Standaard probleem bij een goed genormaliseerde database. Je kan geen AND clausule in je where gebruiken omdat de verschillende waardes in verschillende rijen staan. Er is geen enkele rij die aan beide voorwaarden voldoet en dus zal het niet werken.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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;

Vervolgens kan je hier dan nog andere gegevens aan joinen als je wilt (dit wordt dan een subquery om de bedrijfs ids te selecteren).
 
Ama saril

ama saril

27/08/2013 13:19:10
Quote Anchor link
Ah bedankt, ik ga hier even mee aan de slag, ik laat het resultaat wel weten. In ieder geval bedankt :)

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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

27/08/2013 16:44:31
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
Gewijzigd op 27/08/2013 16:54:58 door Ger van Steenderen
 
Ama saril

ama saril

27/08/2013 17:29:32
Quote Anchor link
Woo bedankt, als ik morgen weer op werk ben ga ik het direct uitproberen.
 
Ama saril

ama saril

29/08/2013 13:31:04
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.