Hoi beste php'ers,

ik ben nog niet heel lang bezig met php maar heb toch een wens. Gaat om het maken van een query voor 'n kruistabel te laten weergeven. Poosje geleden heb ik me hier ook al me beziggehouden maar ik kan me helaas niet in verdiepen doordat ik kennis niet op niveau heb om dit te kunnen maar ook tijd speelt een rol.

ik ben op zoek naar iemand die me hierbij wil helpen. Dit hoeft uiteraard niet kosteloos te zijn. Ga graag met iemand daarover in onderhandeling buiten het forum om.

Wat is de vraag?

ik heb in een database drie tabellen. tabel medewwerkers, tabel rollen en een tabel waarin een relatie staat tussen die twee.
wat ik nu graag zou willen is dat een dmv een SQL opdracht de waarden van tabel medewerkers verticaal wordt weergegeven en de waarden van tabel rollen horizontaal wordt weergeven. Daar waar een match tussen die twee zitten zou het mooi zijn dat via een symbool (plusje ofzo) wordt getoond op het scherm.

Ik heb geen idee hoe dit werkt vandaar dat ik de vraag hier parkeer. Hoop dat iemand me hier mee wil helpen
Kunnen we onderling de vraag fine tunen waar nodig..

Alvast bedankt,
Dirk
maar is het dan niet vreemd dat die alleen bij de eerst genoemde persoon doet vanaf persoon 2 en verder kloppen de rollen die bij een persoon horen... kan haast geen andere conclusie trekken.
Ik zie de fout ook niet zo 1-2-3.
Hoe ziet in korte lijnen je tabel eruit met minimalistische gegevens?
Enige wat ik mij kan indenken is een opbouwfout in je table.
TAAADAAAAAA gevonden...
Ik roep in mijn SELECT de rol vanuit de verkeerd tabel aan. In code hierboven riep ik de rol aan uit de tabel idm_role.MSKEYVALUE_ROL maar dit moest dus idm_person2role.MSKEYVALUE_ROL zijn.... Nu klopt het dus helemaal... Pfff.

Nu zou ik waarden van de rollen en rijen bij elkaar opgeteld willen hebben ... hoe moet ik dit aanvliegen?
Hoe zie je dat optellen van die rechten voor je??
Zie hieronder het resultaat van de kruistabel:




Wat ik dus aanvullend zou willen dat er een optelling wordt gedaan van iedere kolom en van iedere rij... zodat je kan aflezen hoe vaak een rol gekoppeld is en hoeveel rollen een persoon heeft.
Dit kun je in de arrays doen voordat je de tabel uitdraait?
mmmmmm...

toch vind ik op forum niet zo gek veel voorbeelden hoe ik dat zou moeten doen. Als ik aan oom Google vraag wordt ik weer het hele internet overgestuurd met 1001 mogelijkheden waar geen hout van snap. Heb je iets meer houvast?
Als het goed is heb je een array data[<user id>][<right id>]. Dus als je een count doet op data[<user id>] heb je al het aantal rechten per gebruiker.

Voor de rechten maak je een apart array aan waarbij je per id elke keer 1 optelt (data2[<right id>]++), wel even initialiseren op 0 ingeval <right id> nog niet voorkomt in data2.

En als je dus deze arrays opbouwt voordat je de tabel genereert heb je dus ook meteen alle informatie beschikbaar.
Thnx Thomas voor de aanzet..
stukje bij beetje en probeersel hier, probeersels daar kom ik dichterbij het resultaat waar ik naar op zoek ben.
mbv een COUNT kan ik het aantal rollen tellen die iemand heeft. Dat werkt. Zie afbeelding hieronder.
Echter de horizontale rij tellen dat lukt me niet. Van alles geprobeerd maar de methodiek nog niet gevonden. Met een count krijg ik wel het aantal medewerkers geteld, maar dat is niet wat ik zoek. Ik zou dus aan hoeveel medewerkers een rol is toegekend.

De afbeelding van de matrix zover ik hem nu gereed heb:


de code die ik hiervoor gebruik is:
function ou_r2mkruistabel (){
		global $connection;
		
		$where = NULL;
		if (isset($_GET['ou'])){
			$where = 'WHERE idm_person.ACHMEA_REF_OU = "'.mysqli_real_escape_string($connection, $_GET['ou']).'"';
		}
		
		$sqlUitlezen = mysqli_query($connection, "SELECT	
		CONCAT(idm_person.ACHMEA_CALLNAME, ' ', idm_person.MX_LASTNAME, ' <br>(', idm_person.ACHMEA_EMPLOYEENUMBER, ')' ) naam,
		idm_person2role.MSKEYVALUE_ROL rol

		
		FROM `idm_person`
			
		LEFT JOIN `idm_person2role` 
			ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
			
		LEFT JOIN `idm_role`
			ON idm_role.MSKEYVALUE_ROL = idm_person2role.MSKEYVALUE_ROL

		".$where."

		ORDER BY idm_person2role.MSKEYVALUE_ROL, idm_person.MX_LASTNAME ASC
		");
		
		//---------------
		$sqlUitlezenOu = mysqli_query($connection, "SELECT 
		idm_person.DISPLAYNAME,
		idm_ou.MSKEYVALUE_OU,
		idm_ou.DISPLAYNAME
		
		FROM idm_person
		
		INNER JOIN `idm_ou` ON idm_person.ACHMEA_REF_OU = idm_ou.MSKEYVALUE_OU

		".$where." 
		");
		
		$sqlTelRecords = mysqli_num_rows($sqlUitlezen);
			$sqlAantal = $sqlTelRecords - 1;
		$sqlAantalOu = mysqli_num_rows($sqlUitlezenOu);
		if ($sqlAantalOu > 0){
			$sqlDataOu = mysqli_fetch_assoc($sqlUitlezenOu);
			
			echo '<table border="0" width="100%">';
			echo '<tr>';
			echo '<td align="center" valign="top" rowspan="3" width="100"><a href="javascript:javascript:history.go(-1)"><img src="../img/vorige_pagina_button.png" height="80"></td>';
			echo '<td valign="bottom"><h3>Rol / Medewerker koppelingen (matrix)</h3></td>';
			echo '</tr>';
			echo '<td valign="top"><h2>'.$sqlDataOu['DISPLAYNAME'].'</h2></td>';
			echo '</tr>';
			echo '<tr>';
			echo '<td colpan="2" align="right"><h6>Ik heb '.$sqlAantal.' rol / medewerker koppelingen gevonden op de afdeling <i>'.$sqlDataOu['DISPLAYNAME'].'</i></h6></td>';
			echo '</tr>';
			echo '</table>';
		}

		//---------------
		$sqlData = mysqli_fetch_all($sqlUitlezen, MYSQLI_ASSOC);
		
		if ($sqlAantal > 0){
			
			foreach($sqlData as $rij) {
			$namen[$rij['rol']] = $rij['rol'];
			$draai[$rij['naam']][$rij['rol']] = true;
			}
				echo '<table id="idmdata" border="1">' . PHP_EOL;
				echo '<tr>
						<th colspan="2"></th>';
							foreach($draai as $key=>$rol) {
								echo '<th>' . $key . '</th>';
							}
				echo '</tr>';
				
				echo '<tr>
						<td>Uniek kenmerk rol</td>
						<td>#</td>';
							foreach($draai as $key=>$rol) {
								echo '<td align="center"><font size="2"><b><i>'.count($rol).'</i></b></font></td>';
							}
				echo '</tr>';
				
				 
			foreach ($namen as $naam) {
				echo '<tr>
					<td>'. $naam . '</td>' . PHP_EOL;
				echo '<td>'.count($draai).'</td>';
						foreach($draai as $key=>$rol) { 
							if(isset($draai[$key][$naam])) {
								
								echo '<td align="center"><b>?</b></td>';
							}else{
								echo '<td></td>';
							}
						}
				echo '</tr>';
			}
				echo '</table>';
		}else{
			echo '<center><a href="javascript:javascript:history.go(-1)"><img src="../img/no-data.png"></a></center>';
		}		
	}


Hoe ga ik het nu voor elkaar krijgen dat het aantal rollen gekoppeld aan de hoeveelheid personen opgeteld worden?

Nou, je zult dat moeten tellen in je foreach-loop over $sqlData?

Dus zoiets (niet getest)?
<?php
$roleCount = array();
foreach ($sqlData as $rij) {
    $namen[$rij['rol']] = $rij['rol'];
    $draai[$rij['naam']][$rij['rol']] = true;
    if (isset($roleCount[$rij['rol']]) === false) {
        $roleCount[$rij['rol']] = 0;
    }
    $roleCount[$rij['rol']]++;
}
?>

En regel 88 wordt dan volgens mij $roleCount[$naam] in plaats van count($draai)?

Persoonlijk zou ik het genrereren van de gewenste data en het uitdraaien van de tabel wat meer scheiden, want op deze manier wordt het nogal snel onoverzichtelijk.

Reageren