Hallo allemaal,

ik vraag mbv query gegevens op meerder tabellen.
Doel is om te tonen welke personen welke rol hebben. Echter het lukt me alleen om dit een platte lijst te tonen.
Dus resultaat is:

Rol 1 - persoon 1
Rol 1 - persoon 2
Rol 1 - persoon 3
Rol 2 - persoon 1
Rol 3 - persoon 1
Rol 3 - persoon 2
enz

Zo zie dat de rolnaan constant getoond wordt.
Wat ik graag zou willen is dat de lijst er ongveer zo uit te komt zien:

Rol 1 - persoon 1
- persoon 2
- persoon 3

Rol 2 - persoon 1

Rol 3 - persoon 1
- persoon 2

Hoe kan ik dit voor elkaar krijgen? Ik dacht iets met GROUP BY in mijn sql maar levert ook nog niet het gewenste resultaat op.


Voor de volledigheid mijn code:

	//------------------------------------------------------------------------ FUNCTIE DIDM contactpersoon
	function didmcontact (){
	global $connection;
			
		$sqlUitlezen = mysqli_query($connection, $sql = "
			SELECT 
				person.*,
				person2role.*,
				role.*
			FROM 
				person
			LEFT JOIN person2role ON person2role.MSKEYVALUE_MEDEWERKER = person.MSKEYVALUE_MEDEWERKER
			LEFT JOIN role ON role.MSKEYVALUE_ROL = person2role.MSKEYVALUE_ROL
			
			WHERE role.MSKEYVALUE_ROL LIKE 'ROLE:PROCES:DECENTRAAL IDM BEHEER%'
					
			ORDER BY role.ACHMEA_ROLETYPE ASC, role.MSKEYVALUE_ROL ASC			
			");
		
		$sqlAantal = mysqli_num_rows($sqlUitlezen);
		
		if ($sqlAantal > 0){
			echo '<article>';
			echo '<table id="customers">';
			echo '	<tr>';
			echo '	<td colspan="5" align="right"><h3>Aantal rollen gekoppeld ('.$sqlAantal.') ';
			echo '	</tr>';
			echo '  <tr>';
			echo '	<th nowrap><h4>DIDM Contactpersonen</h4></th>';
			echo '	<th colspan="2"><h4></h4></th>';
			echo '  </tr>';
			
			while ($sqlData = mysqli_fetch_assoc($sqlUitlezen)){	
			
			echo '  <tr>';
			echo '	<td><h5>'.$sqlData['MSKEYVALUE_ROL'].'</h5></td>';
			echo '	<td><h6>'.$sqlData['MX_FIRSTNAME'].' '.$sqlData['MX_LASTNAME'].'</h6></td>';
			echo '  </tr>';
			}
			echo '</table>'; 
			echo '</article>';
		}else{
			echo '<h4>Sorry, ik kan geen medewerker-rolkoppeling vinden!</h4>';
		}
	}
De "rol" steeds onthouden. Als de huidige rol gelijk is aan de vorige, dan niet tonen.
Huh???? dat begrijp ik niet.. ik lees wat er staat maar hoe werkt dat dan?
Gesorteerd op rol bedoel je?
Dan zou dit een oplossing moeten bieden!

Gebruik wel een ORDER BY rol in je query.

<table>
<?php
$result = mysqli_query($conn,$sql); 

// defineer lege rol omdat we in de eerste iteratie al gaan vergelijken.
$vorige_rol  = '';

while($row = mysqli_fetch_assoc($result))
{
  if($vorige_rol != $row['rol'])
  {
    // We hebben te maken met data dat niet van dezelfde rol
    // is als het blok dat hierboven stond.
    // Dus maken we de kopregel aan, en kennen we de nieuwe rol toe.
    echo '<tr><th colspan="2">'.$row['rol'].'</th></tr>';
    $vorige_rol = $row['rol'];
  }

  // of we nu wel of niet een kopregel moesten weergeven, hier volgt de data.
?>
<tr>
  <td>&nbsp;</td>
  <td><?php echo $row['persoon'];?></td>
</tr>
<?php
}
?>
</table>


Edit: Variabele was fout overgenomen
GROUP is niet nodig, want je groepeert in jouw voorbeeld al met PHP zelf.
Enkel een ORDER. Kijk eens naar mijn code.

Of moet de eerste persoon steeds apart ingesprongen worden, omdat die belangrijk (leider?) is? Wordt dit ergens bepaald in je record?
Thnks 4 the input guys, ik ga dit morgen eens op mijn gemak bekijken. ik heb nu een wedstrijd.

@Adoptive Solution... ja dat lijkt er inderdaad op.

@ Arien... de eerste persoon is niet belangrijker dan de overige personen. Allen staan gelijk aan elkaar binnen een rol
Bij Adoptive Solution komt het er komma gescheiden uit.
En bij mijn voorbeeld is het een tabel, zoals je ook al schematisch aangaf in je eerste post.

Wat wil je nu precies? Want je lijkt nu opeens van richting te veranderen :P

Wel zie ik dat de eerste persoon naast de rol staat, hoort dat?
@Arien,

nee hoor.. ik heb eigelijk voor de weergave nog niet een exact een keus.. maar gezien de opbouw van de rest gaat mijn voorkeur uit naar een tabel (jouw voorstel :-))

In het voorbeeld heb ik de eerste persoon idd naast de rol geplaatst. Maar dit is niet in beton gegoten hoor. Die zou er ook onder mogen.

(moet nu weg, lees morgen de reactie weer)
Gebaseerd op voorbeeld uit eerdere link.

Als opgehaalde $result een object is :


<table>
<?php
foreach( $result as $row )
{
	$products = explode(',', $row->Product);
	$first = TRUE;
	foreach ($products as $product) {
		if ( $first ) {
			echo '<tr><td rowspan="' . count($products ). '">' . $row->category . '</td><td>'. $product . '</td></tr>';
			$first = !$first;
		}
		else {
			echo '<tr><td>' . $product. '</td></tr>';
		}
	}
}
?>
</table>
Die van @Adoptive vink ik een beetje link. Als er ooit een komma in je waarde zit ga je daar ook op exploden, en dan wordt het bagger. Mijn suggestie was wat @Ariën heeft uitgewerkt. In plaats van een kopregel kun je de "rol" ook in de 1e kolom doen. Als ie dan herhaalt laat je die kolom gewoon leeg.

Reageren