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.
<?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)
<?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:
<?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.
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:

  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).
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.
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
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.

Reageren