Hoe kan ik gegevens gegroepeerd laten tonen?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dirk Huizinga

Dirk Huizinga

08/02/2019 17:09:56
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
    //------------------------------------------------------------------------ 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>';
        }
    }
Gewijzigd op 08/02/2019 17:24:39 door Dirk Huizinga
 
PHP hulp

PHP hulp

19/03/2019 03:57:50
 
Rob Doemaarwat

Rob Doemaarwat

08/02/2019 17:19:53
Quote Anchor link
De "rol" steeds onthouden. Als de huidige rol gelijk is aan de vorige, dan niet tonen.
 
Dirk Huizinga

Dirk Huizinga

08/02/2019 17:25:39
Quote Anchor link
Huh???? dat begrijp ik niet.. ik lees wat er staat maar hoe werkt dat dan?
 
- Ariën -
Beheerder

- Ariën -

08/02/2019 17:28:15
Quote Anchor link
Gesorteerd op rol bedoel je?
Dan zou dit een oplossing moeten bieden!

Gebruik wel een ORDER BY rol in je query.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<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
Gewijzigd op 08/02/2019 17:34:05 door - Ariën -
 
Adoptive Solution

Adoptive Solution

08/02/2019 17:33:40
Quote Anchor link
Lijkt dit erop

https://stackoverflow.com/questions/11928360/output-mysql-list-of-records-grouped-by-category

Van komma gescheiden velden vervolgens met php explode een array maken.
 
- Ariën -
Beheerder

- Ariën -

08/02/2019 17:35:09
Quote Anchor link
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?
Gewijzigd op 08/02/2019 17:37:16 door - Ariën -
 
Dirk Huizinga

Dirk Huizinga

08/02/2019 17:48:51
Quote Anchor link
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
 
- Ariën -
Beheerder

- Ariën -

08/02/2019 17:51:33
Quote Anchor link
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?
Gewijzigd op 08/02/2019 17:52:52 door - Ariën -
 
Dirk Huizinga

Dirk Huizinga

08/02/2019 18:16:11
Quote Anchor link
@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)
 
Adoptive Solution

Adoptive Solution

08/02/2019 18:33:11
Quote Anchor link
Gebaseerd op voorbeeld uit eerdere link.

Als opgehaalde $result een object is :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>
Gewijzigd op 08/02/2019 18:33:52 door Adoptive Solution
 
Rob Doemaarwat

Rob Doemaarwat

08/02/2019 20:16:48
Quote Anchor link
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.
 
Adoptive Solution

Adoptive Solution

08/02/2019 20:31:50
Quote Anchor link
Dan gebruik je geen komma als separator, maar een leesteken dat niet in het veld voorkomt.
Vervolgens gebruik je dat teken om te exploden.
 
Rob Doemaarwat

Rob Doemaarwat

08/02/2019 20:36:03
Quote Anchor link
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 ...
 
Adoptive Solution

Adoptive Solution

08/02/2019 20:44:02
Quote Anchor link
Ik zie je lijden.
 
Dirk Huizinga

Dirk Huizinga

09/02/2019 18:26:34
Quote Anchor link
@ Arien,

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.
 
- Ariën -
Beheerder

- Ariën -

09/02/2019 19:17:00
Quote Anchor link
Dan moet je een INNER JOIN gebruiken.
 
Dirk Huizinga

Dirk Huizinga

09/02/2019 19:56:03
Quote Anchor link
Dat dacht ik dus ook.... maar het is pittige kost... en voor mij nog niet zo vanzelfsprekend.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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            
            ");


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
 
- Ariën -
Beheerder

- Ariën -

09/02/2019 20:55:38
Quote Anchor link
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'...

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



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.