Hoe kan ik gegevens gegroepeerd laten tonen?
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//------------------------------------------------------------------------ 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>';
}
}
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>';
}
}
Gewijzigd op 08/02/2019 17:24:39 door - DHU -
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?
Dan zou dit een oplossing moeten bieden!
Gebruik wel een ORDER BY rol in je query.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<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> </td>
<td><?php echo $row['persoon'];?></td>
</tr>
<?php
}
?>
</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> </td>
<td><?php echo $row['persoon'];?></td>
</tr>
<?php
}
?>
</table>
Edit: Variabele was fout overgenomen
Gewijzigd op 08/02/2019 17:34:05 door - Ariën -
https://stackoverflow.com/questions/11928360/output-mysql-list-of-records-grouped-by-category
Van komma gescheiden velden vervolgens met php explode een array maken.
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?
Gewijzigd op 08/02/2019 17:37:16 door - Ariën -
@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
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?
Gewijzigd op 08/02/2019 17:52:52 door - Ariën -
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)
Als opgehaalde $result een object is :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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>
<?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>
Gewijzigd op 08/02/2019 18:33:52 door Adoptive Solution
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.
Vervolgens gebruik je dat teken om te exploden.
Adoptive Solution op 08/02/2019 20:31:50:
maar een leesteken dat niet in het veld voorkomt.
Haha, hoe vaak ik daar al tegenaan gelopen ben ... Dan dacht iemand in het verleden een "onmogelijk" teken te gebruiken. Vervolgens kwam er een creatieveling langs, of gewoon iemand die geen Nederlands/Engels gebruikte, en dan zocht je jezelf de pleuris waarom de boel opeens niet meer werkte ...
Ik zie je lijden.
top solution hoor. prachtig resulaat. ik ga die op meerdere plekken doorvoeren.
thanks man.
Toevoeging op 09/02/2019 18:54:11:
nu zit ik nog struggelen in dit overzicht gegevens uit een 4e tabel te trekken. de 4e tabel bevat gegevens die wat vertellen over bijv. eigenaarschap van de rol. Daarbij ga ik tegen gelijknamige velden in meerdere rollen aanlopen (ik hebt ook niet bedacht) ... wellicht op te lossen met aliassen maar het valt me nog niet mee.. de query wordt steeds complexer :-).... en ik wil het ook nog 'ns gaan begrijpen.... pittige kost hoor.
Dan moet je een INNER JOIN gebruiken.
al die JOINS.... de keuze is reuze. Als in begin van dit topic kijkt zie je dat ik al gebruik van JOINS maak. Maar ik doorgrond het nog nog niet helemaal.
dus ik dacht het simpel te doen door er een tabel ou bij de plaatsen en nog een JOIN erbij en klaar is kees. Echter, niks is minder waar...
Mijn SELECT komt er dan zo uit te zien:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$sqlUitlezen = mysqli_query($connection, $sql = "
SELECT
person.*,
person2role.*,
role.*
ou.*
FROM
person
LEFT JOIN person2role ON person2role.MSKEYVALUE_MEDEWERKER = person.MSKEYVALUE_MEDEWERKER
LEFT JOIN role ON role.MSKEYVALUE_ROL = person2role.MSKEYVALUE_ROL
INNER JOIN ou ON role.ACHMEA_REF_OU = ou.MSKEYVALUE_OU
WHERE role.MSKEYVALUE_ROL LIKE 'ROLE:PROCES:DECENTRAAL IDM BEHEER%'
ORDER BY role.MSKEYVALUE_ROL ASC, person.MX_LASTNAME ASC
");
SELECT
person.*,
person2role.*,
role.*
ou.*
FROM
person
LEFT JOIN person2role ON person2role.MSKEYVALUE_MEDEWERKER = person.MSKEYVALUE_MEDEWERKER
LEFT JOIN role ON role.MSKEYVALUE_ROL = person2role.MSKEYVALUE_ROL
INNER JOIN ou ON role.ACHMEA_REF_OU = ou.MSKEYVALUE_OU
WHERE role.MSKEYVALUE_ROL LIKE 'ROLE:PROCES:DECENTRAAL IDM BEHEER%'
ORDER BY role.MSKEYVALUE_ROL ASC, person.MX_LASTNAME ASC
");
maar ja... mijn foutmelding komt er dan zo uit te zien:
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\wamp64\www\bp\members\inc\plugin.php on line 766
dus ergens begrijp ik het nog niet... toch maar door blijven 'modderen'...
Toevoeging op 09/02/2019 20:07:30:
YeAH gelukt.... hierboven ook een komma vergeten te zetten... thnx
Dirk Huizinga op 09/02/2019 19:56:03:
maar ja... mijn foutmelding komt er dan zo uit te zien:
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\wamp64\www\bp\members\inc\plugin.php on line 766
dus ergens begrijp ik het nog niet... toch maar door blijven 'modderen'...
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\wamp64\www\bp\members\inc\plugin.php on line 766
dus ergens begrijp ik het nog niet... toch maar door blijven 'modderen'...
En dan blijf ik erbij dat PHP enkel aangeeft dat hij een boolean in de vorm van 'nee' terug krijgt. Dus moet je verder debuggen met mysqli_error en kijken wat MySQL / MariaDB te zeggen heeft..
Quote:
YeAH gelukt.... hierboven ook een komma vergeten te zetten... thnx
Mooi dat het gelukt is :-)