Problemen met toevoegen COUNT aan MYSQL query

Status
Niet open voor verdere reacties.

BlueDirkje

Nieuwe gebruiker
Lid geworden
1 okt 2012
Berichten
4
Dag Allemaal,

De volgende query werkt:
[sql](SELECT
date_format (dat_start, '%d-%m-%Y') AS dat_start,
date_format (dat_eind, '%d-%m-%Y') AS dat_eind,
o.nm,
r.naam

FROM
relatie


LEFT JOIN
organ o
ON
o.orgid = relatie.organ_orgid
LEFT JOIN
rollen r
ON
r.rolid = relatie.rolid_rol
WHERE
relatie.pers_persid = '$persid2'

)[/sql]

Het vult de volgende velden, behalve het veld ($rij['aantal']). :
PHP:
echo '<tr>';
		echo '<td class="datum">' . htmlentities ($rij['dat_start']).'</td>';
		
		echo '<td class="datum">' . htmlentities ($rij['dat_eind']). '</td>';
		echo '<td class="org">' . htmlentities ($rij['nm']). '</td>';
		echo '<td class="omschr">' . htmlentities (ucwords($rij['naam'])).'</td>';
		
			
		echo '<td class="cirkel">'. htmlentities ($rij ['aantal']).'</td>';
		echo '</tr>';

Voor het veld ($rij['aantal']) wil ik een COUNT toevoegen aan de query.

De bedoeling is dat in dat vijfde veld een getal komt te staan, dat aangeeft hoeveel andere personen op het moment tussen dat_start en dat_eind dezelfde functie hadden als '$persid2'.

Ik heb al aardig wat geprobeerd de afgelopen, maar ik kom maar niet in de buurt van een passende oplossing.

Kan een van jullie mij verder op weg helpen?

Alvast hartelijk dank!
 
Vermoedelijk zul je hier een subquery voor moeten gebruiken.

Heb je al een query kunnen maken waarin je dit aantal terug krijgt?
 
Hoi Devil,

Ben nog aan het knutselen. Het lukt me om een aantal weer te geven , maar bij het toevoegen van de voorwaarden gaat het mis.
 
Omdat er geen inzicht is in de tabelstructuren wordt het lastig een query te geven.
Is het een optie om je tabelstructuur in een fiddle te plaatsen?

De moeilijkheid zit hem denk ik in de datum, wellicht zul je hier de operator BETWEEN ... AND ... voor moeten gebruiken.
 
Beste Devil,

Ik kom er nog niet uit. Hieronder heb ik de structuur van de tabel weergegeven. Wellicht dat je aan de hand van deze informatie mij een end de goede richting op kunt helpen:

[sql]CREATE TABLE IF NOT EXISTS `relatie` (
`relid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`organ_orgid` int(10) unsigned NOT NULL,
`pers_persid` int(10) unsigned NOT NULL,
`rolid_rol` int(10) unsigned NOT NULL,
`dat_start` date DEFAULT NULL,
`dat_eind` date DEFAULT NULL,
`omschr` varchar(25) DEFAULT NULL,
PRIMARY KEY (`relid`,`organ_orgid`),
KEY `relatie_FKIndex2` (`organ_orgid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;[/sql]

Dit is een koppeltabel gelinkt aan 3 andere tabellen: organ, pers en rollen.

Het lijkt mij niet om uit deze tabel te halen hoeveel andere 'pers_persid' in de periode tussen 'dat_start' en 'dat_eind' dezelfde 'rolid_rol' hadden als de ingevoerde persoon '$persid2', die ook in dezelfde tabel voorkomt. De uitkomst moet dus een getal worden die in de vijfde kolom komt te staan.

Ik ga zelf nog verder puzzelen, maar misschien heb jij op basis van deze informatie nog een tip voor mij.
 
[SQL]
SELECT
date_format (dat_start, '%d-%m-%Y') AS datum_start,
date_format (dat_eind, '%d-%m-%Y') AS datum_eind,
or.nm,
ro.naam,
(
SELECT
COUNT(*)
FROM
relatie re2
WHERE
re2.rolid_rol = ro.rolid
) AS aantal
FROM
relatie re
LEFT JOIN
organ or ON or.orgid = re.organ_orgid
LEFT JOIN
rollen ro ON ro.rolid = re.rolid_rol
WHERE
re.pers_persid = '$persid2'
[/sql]
Waarschijnlijk krijg je op deze manier het aantal relaties met dezelfde rolid als die van pers_persid.

Rest alleen het datum gedeelte nog, een poging:
[sql]
SELECT
date_format (dat_start, '%d-%m-%Y') AS datum_start,
date_format (dat_eind, '%d-%m-%Y') AS datum_eind,
or.nm,
ro.naam,
(
SELECT
COUNT(*)
FROM
relatie re2
WHERE
re2.rolid_rol = ro.rolid
AND re2.dat_start BETWEEN datum_start AND datum_eind
AND re2.dat_eind BETWEEN datum_start AND datum_eind
) AS aantal
FROM
relatie re
LEFT JOIN
organ or ON or.orgid = re.organ_orgid
LEFT JOIN
rollen ro ON ro.rolid = re.rolid_rol
WHERE
re.pers_persid = '$persid2'
[/sql]
 
Hallo Devil,

Zeer bedankt voor de voorbeelden. Ik ben er erg blij mee:-)
De sql die het uiteindelijk is geworden:

[sql](SELECT
date_format (dat_start, '%d-%m-%Y') AS dat_start,
date_format (dat_eind, '%d-%m-%Y') AS dat_eind,
o.nm,
r.naam,

(SELECT COUNT(*)
FROM
relatie re2
WHERE
re2.rolid_rol = r.rolid
AND re2.dat_start
BETWEEN datum_start AND datum_eind
AND re2.dat_eind
BETWEEN datum_start AND datum_eind

) AS aantal

FROM
relatie

LEFT JOIN
organ o
ON
o.orgid = relatie.organ_orgid
LEFT JOIN
rollen r
ON
r.rolid = relatie.rolid_rol

WHERE
relatie.pers_persid = '$persid2'
)
[/sql]

Wellicht hebben andere hier ook wat aan. Het toevoegen van de subquery was het moeilijkste van allemaal. In verschillende boeken die ik thuis heb, kon ik niet echt een goed voorbeeld vinden dat mij op weg kon helpen. Jouw input in ieder geval wel!

Waarvoor mijn dank. Alle kolommen worden nu netjes gevuld.

Morgen uitgebreid testen en zien of hij ook echt doet wat ie moet doen:-)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan