Cijfers uit mysql in de juiste html tabel krijgen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Brecht S

Brecht S

24/06/2015 14:33:23
Quote Anchor link
Ik heb een html tabel (vb):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
Ras          jan feb mrt apr mei jun jul aug sep okt nov dec
Holsteiner    0   1  10  15  0    2   3   5   4   8   9   1
Aubrac        1   5  1   10  2    8   7   6   2   4   3   7
...


En een mysql database als volgt opgebouwd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
id  datum        ras          email      aantal
1   2015-06-24   aubrac       [email protected]      1
2   2015-06-23   Holsteiner   [email protected]     1
...


Welke query kan ik nu gebruiken om de juiste waarden in de juiste kolommen te krijgen?
Ik heb voor de maand uit de datum te halen het volgende gebruikt MONTH(datum).
En de aantallen per ras zou ik kunnen optellen (een ras kan uiteraard meerdere keren voorkomen per maand) met SUM(ras).
Alleen zie ik niet het geheel en zeker ook niet hoe die dan in de juiste html kolom terecht komen (de juiste maand kolom).
Gewijzigd op 24/06/2015 14:34:02 door Brecht S
 
PHP hulp

PHP hulp

21/11/2024 22:47:43
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

24/06/2015 21:59:07
Quote Anchor link
Je kan in MySQL een virtuele tabel creëren met
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT 1 as month_no UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION
SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12

Dit bak je in een subquery en daarna join je de tabel waarin je die gegevens hebt staan.
Ik ben in een goeie bui dus:
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
SELECT
    m.month_no,
    d.ras,
    SUM(d.aantal)
FROM
    (SELECT 1 as month_no UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
     SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION
     SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12
    ) m
LEFT JOIN
    tabelnaam d
    ON
        m.month_no = MONTH(d.datum)
GROUP BY d.rasm, m.month_no
Gewijzigd op 24/06/2015 22:40:04 door Ger van Steenderen
 
Brecht S

Brecht S

24/06/2015 22:32:02
Quote Anchor link
@Ger: bedankt voor je code. De tabelnaam is wedstrijd (even meegeven).
De waarden worden precies wel goed opgeteld en samengevoegd per ras. Alleen zie ik ook nog niet goed hoe je dit nu de cijfers (sum van de aantallen) in de juiste maandtabel kan 'duwen'.
Ik heb dit even in een while uitgelezen en krijg nu dit als resultaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
                1                                        
                2                                        
                3                                        
                4                                        
                5                                        
aubrac     2    6                                        
simmental  3    6                                        
                7                                        
                8                                        
                9                                        
               10                                        
               11                                        
               12


Ik lees de waarden als test uit met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<td><?php echo $row['ras']; ?></td>
<td><?php echo $row['SUM(d.aantal)']; ?></td>
<td><?php echo $row['month_no']; ?></td>


Ik zie ook dat je ondertussen de GROUP BY hebt gewijzigd maar ditmaal met een fout in. d.rasm bestaat niet.
Gewijzigd op 24/06/2015 22:54:02 door Brecht S
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

24/06/2015 22:53:48
Quote Anchor link
Mijn excuus, je moet de group by omdraaien (ik heb dit inmiddels aangepast)
Je krijgt dan een resultaat in een volgorde die jij kan vertalen in rij per ras.
Anders google
 
Brecht S

Brecht S

24/06/2015 22:55:09
Quote Anchor link
EDIT in mijn vorige post. Ik zie dat je ondertussen inderdaad de GROUP BY hebt gewijzigd maar ditmaal met een fout in: d.rasm bestaat niet. Dus ik heb daarvan d.ras gemaakt. Dit geeft bijna hetzelfde resultaat als daarnet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
                1                                        
                2                                        
                3                                        
                4                                        
                5                                        
                7                                        
                8                                        
                9                                        
               10                                        
               11                                        
               12
aubrac     2    6                                        
simmental  3    6



Toevoeging op 24/06/2015 23:06:38:

Ik weet niet of je helemaal mee bent in het verhaal. Wat ik wil bereiken is het onderstaande gebaseerd op het resultaat uit je query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
Ras        Jan Feb Mrt Apr Mei Jun Jul Aug Sep Okt Nov Dec
aubrac                          2
simmental                       3
Gewijzigd op 24/06/2015 23:08:00 door Brecht S
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

24/06/2015 23:32:54
Quote Anchor link
Dan zet je een cross join op de maand en het ras id.
 
Brecht S

Brecht S

25/06/2015 15:31:37
Quote Anchor link
Ik heb nu deze 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
SELECT
    m.month_no,
    d.ras,
    SUM(d.aantal)
FROM
    (SELECT 1 as month_no UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
     SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION
     SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12
    ) m
CROSS JOIN
    wedstrijd d
ON
    m.month_no = MONTH(d.datum)
GROUP BY
    d.ras, m.month_no


Alle maanden die geen aantallen hebben (dus waarvan de SUM = 0) zijn nu verdwenen.
Nu moet ik die nog in de juiste maandkolom krijgen en dit lijkt niet zo eenvoudig.

Resultaat tot nu toe (uitgelezen met de <td>'s hierboven beschreven):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
Ras       Aantal  Month_no
aubrac       2       6                                        
simmental    3       6


En in dit onderstaande formaat (maandtabellen) moet ik het krijgen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
Ras        Jan Feb Mrt Apr Mei Jun Jul Aug Sep Okt Nov Dec
aubrac                          2
simmental                       3
Gewijzigd op 25/06/2015 15:58:49 door Brecht S
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

25/06/2015 17:42:48
Quote Anchor link
Heb je geen tabel voor de verschillende rassen? Dat zou niet verstandig zijn.

Die tabel kan je dan met een CROSS JOIN aan de maand no toevoegen en daarna met de LEFT JOIN op maand_no en ras de wedstrijd tabel.
 
Brecht S

Brecht S

25/06/2015 20:54:02
Quote Anchor link
Nee ik heb geen rassen tabel. Maar kan er wel een maken ;-)
Ik heb nu een tabel rassen met kolom id en kolom ras? Kan ik daarmee verder?

Toevoeging op 25/06/2015 21:08:40:

Is het zoiets wat je bedoeld?
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
SELECT
    m.month_no,
    d.ras,
    SUM(d.aantal)
FROM
    (SELECT 1 as month_no UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
     SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION
     SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12
    ) m
CROSS JOIN
    rassen e
ON
   e.ras = d.ras
LEFT JOIN
    wedstrijd d
ON
    m.month_no = MONTH(d.datum)
GROUP BY
    d.ras, m.month_no
Gewijzigd op 25/06/2015 20:54:33 door Brecht S
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

26/06/2015 09:56:49
Quote Anchor link
Het idee achter een CROSS JOIN is om alle rijen van de ene tabel te koppelen aan alle rijen van de andere tabel, je moet dan geen voorwaarden meegeven want dan maak je er een 'normale' join van.

Bijv:
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
SELECT * FROM
    (SELECT 1 as month_no UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
     SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION
     SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12
    ) m
CROSS JOIN
    (SELECT 'Brecht' ras UNION select 'Vuilnisbak') r

+ ------------- + ---------- +
| month_no      | ras        |
+ ------------- + ---------- +
| 1             | Brecht     |
| 1             | Vuilnisbak |
| 2             | Brecht     |
| 2             | Vuilnisbak |
| 3             | Brecht     |
| 3             | Vuilnisbak |
| ...           | ......     |
| 11            | Brecht     |
| 11            | Vuilnisbak |
| 12            | Brecht     |
| 12            | Vuilnisbak |
+ ------------- + ---------- +

De rest kan je zelf bedenken.
 
Brecht S

Brecht S

26/06/2015 10:34:59
Quote Anchor link
Ik begrijp er niks van. Ik veronderstel dat het ras 'Brecht' in jouw voorbeeld bvb 'aubrac' kan zijn maar wat betreft die UNION, wat komt dan in de plaats van 'vuilnisbak'?
Of moet ik die regel gewoon verder schrijven: (select 'aubrac' ras union select 'holsteiner' union select ...)?
En wat met die left join die er nu niet tussen staat?
Als ik wel toevoeg krijg ik eerst een lege tabel met de month_no in en dan pas een overzicht per maand.
En waarom moet ik dan een extra tabel rassen maken?
Ook de aantallen zijn belangrijk per maand_no
Gewijzigd op 26/06/2015 10:44:38 door Brecht S
 
Thomas van den Heuvel

Thomas van den Heuvel

26/06/2015 11:32:15
Quote Anchor link
In plaats van de maandenruimte op te spannen in de database zelf kun je ook gewoon een for-loop gebruiken in PHP. Dan komt het maar niet uit 1 perfecte query die je in 1 loop kunt doorlopen, een beetje praktisch blijven mensen.

Ook als je je rassen in een aparte tabel hebt zitten zou je de HTML-tabel nog dynamischer kunnen opbouwen.

Sla je resultaten op in een arraytje wat een beetje handig uit te lezen valt en controleer in de loop of er entries zijn voor die maand:

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
<?php
$rassen
= array(1 => 'aubrac', 2=> 'simmental');

// je query, sla resultaten op in een array [ras][maand] => [aantal], bijvoorbeeld als volgt:
// ...

$rasAantallen = array(
    1 => array(6 => 2), // ras id 1: aubrac, maand 6, aantal 2
    2 => array(6 => 3), // ras id 2: simmental, maand 6, aantal 3
);

$maanden = array(1 => 'Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec');

// bouw je tabel
?>
<table>
    <thead>
    <tr>
    <th>Ras</th><?php
    foreach ($maanden as $label) {
        ?>
<th><?php echo $label ?></th><?php
    }
    ?>
</tr>
    </thead>
    <tbody><?php
    // doorloop alle rassen
    foreach ($rassen as $rasId => $rasNaam) {
        ?>
<tr>
        <td><?php echo $rasNaam ?></td><?php
        // doorloop voor elk ras alle maanden
        foreach ($maanden as $maandNr => $maandLabel) {
            // als er voor dit ras en deze maand een aantal is, druk deze af, druk anders een spatie af
            if (isset($rasAantallen[$rasId][$maandNr])) {
                ?>
<td><?php echo $rasAantallen[$rasId][$maandNr] ?></td><?php
            } else {
                ?>
<td>&nbsp;</td><?php
            }
        }

        ?>
</tr><?php
    }
    ?>
</tbody>
</table>
Gewijzigd op 26/06/2015 13:22:26 door Thomas van den Heuvel
 
Brecht S

Brecht S

26/06/2015 11:44:30
Quote Anchor link
Heb nu letterlijk dit als resultaat. Denk dat er enkele fouten in je code zitten.
Maanden plakken op elkaar en mei heeft geen 2 results en die 3 valt compleet buiten de maanden. Rasnaam staat nergens vermeld.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
RasJanFebMrtAprMeiJunJulAugSepOktNovDec
                2                        3                                                           
Gewijzigd op 26/06/2015 11:45:47 door Brecht S
 
Thomas van den Heuvel

Thomas van den Heuvel

26/06/2015 11:51:41
Quote Anchor link
Inmiddels is deze (een aantal keren) aangepast.

Zelf ook eea uitproberen kan ook geen kwaad.

Verwacht niet dat er in 1x flawless code wordt gepost.
Gewijzigd op 26/06/2015 11:52:16 door Thomas van den Heuvel
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

26/06/2015 12:25:56
Quote Anchor link
Thomas van den Heuvel op 26/06/2015 11:32:15:
In plaats van de maandenruimte op te spannen in de database zelf kun je ook gewoon een for-loop gebruiken in PHP. Dan komt het maar niet uit 1 perfecte query die je in 1 loop kunt doorlopen, een beetje praktisch blijven mensen.


Sorry hoor, maar als je 10 verschillende rassen hebt dan zou je 120 queries hebben, en naar mijn mening is dat zeer onpraktisch.

@Brecht
Mijn vorige voorbeeld was bedoeld om je te laten zien wat voor resultaat een crossjoin oplevert. Als je de tweede subquery vervangt door de tabel met rassen, moet je zelf kunnen bedenken hoe je de LEFT JOIN op wedstrijden moet doen.

Ik ga het niet voor je voorkauwen, zelf nadenken kan ook geen kwaad.
 
Thomas van den Heuvel

Thomas van den Heuvel

26/06/2015 12:49:20
Quote Anchor link
Ger van Steenderen op 26/06/2015 12:25:56:
Sorry hoor, maar als je 10 verschillende rassen hebt dan zou je 120 queries hebben, en naar mijn mening is dat zeer onpraktisch.

Wait, what? Dat zie ik niet?

Hier verschillen wij van mening denk ik. Ik ben van mening dat vraagstukken aan je database in eerste instantie de juiste informatie ophalen, bij voorkeur in een beetje een handig formaat.

Vervolgens is het prima toegestaan om in PHP nog extra verwerkstappen uit te voeren om de data nog een beetje in de goede vorm te kneden, bijvoorbeeld door deze in een data-structuur te zetten (een array).

En tot slot ga je deze informatie uit je datastructuur gebruiken.

Dit levert enige overhead op, maar ook meer flexibiliteit.

Het nadeel van een "query (precies) op maat" is dat elke keer als je iets in het gebruik verandert, er een grote kans aanwezig is dat je de query moet aanpassen of zelfs moet herschrijven. Als je data meer in een algemene vorm ophaalt (waarbij niet al teveel aannames worden gedaan over het uiteindelijke gebruik) dan is het waarschijnlijk eenvoudiger om ergens onderweg (datastructuur, of zelfs pas bij het weergeven van de data) die aanpassing te doen.

De kans dat je een fout maakt bij een wijziging en het effect van die fout lijkt mij kleiner wanneer dat ergens onderweg (of aan het einde) gebeurt, in tegenstelling tot wanneer je dit in de query zelf doet, waar alles mee valt of staat.
 
Brecht S

Brecht S

26/06/2015 13:17:49
Quote Anchor link
@Thomas: aan jouw code kan ik het beste uit en heb deze draaiende gekregen. Er stonden nog een aantal fouten in die ik er heb uitgehaald.
Het enige wat mij nog rest is een oplossing te vinden om mijn resultaten van de query in een array te plaatsen zoals:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$rasAantallen2 = array(
    1 => array(6 => 2), // ras id 1: aubrac, maand 6, aantal 2
    2 => array(6 => 3), // ras id 2: simmental, maand 6, aantal 3
);

Hiervoor moet ik terug op zoek. Wat een while in een array plaatsen lukt niet echt.

@Ger: met jouw code heb ik nog heel wat meer werk om die draaiende te krijgen. Ik denk wel dat ik weet wat je bedoeld. Alleen het nu nog in de praktijk gaan omzetten...
Ik wil beide mogelijkheden wel onder de knie hebben dus ik ga op zoek.
Gewijzigd op 26/06/2015 13:18:54 door Brecht S
 
Thomas van den Heuvel

Thomas van den Heuvel

26/06/2015 13:25:00
Quote Anchor link
Als je laat zien hoe je de query uitvoert dan kan ik laten zien hoe je het array opbouwt.
 
Brecht S

Brecht S

26/06/2015 13:34:30
Quote Anchor link
Voor de query heb ik maar een aantal velden nodig denk ik. Rekening houdende dat alle data in 1 tabel zit (even afstappen van de 2de tabel rassen die ik had gemaakt). We houden dit dus enkel op 1 tabel wedstrijd.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT
   ras,
   MONTH(datum) as m,
   SUM(aantal) as s
FROM
   wedstrijd

Ik denk dat ik hier best ook met CASE werk, niet? Is de maand = 1 dan is dat jan, enz... Of is dat niet nodig? En dan moet ik nog de array met de rassen koppelen aan die ID nummer...

Toevoeging op 26/06/2015 13:55:50:

Eerder iets in de zin van:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
         SELECT
            (SELECT CASE ras
                  WHEN 'aubrac' THEN 1
                  WHEN 'holsteiner' THEN 2
                  WHEN 'simmental' THEN 3
                  WHEN 'belgisch wit-blauw' THEN 4 END),
            MONTH(datum) as m,
            SUM(aantal) as s
         FROM
            wedstrijd";
Gewijzigd op 26/06/2015 13:37:40 door Brecht S
 
Thomas van den Heuvel

Thomas van den Heuvel

26/06/2015 14:02:41
Quote Anchor link
Ik bedoelde meer in je PHP-code.
 
Brecht S

Brecht S

26/06/2015 14:12:52
Quote Anchor link
Ik heb de array met rassen aangevuld zoals het moet. Voorbeeld van 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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php
$rassen
= array(1 => 'aubrac', 2 => 'holsteiner', 3 => 'simmental', 4 => 'belgisch wit-blauw', 5 => 'piemontese' , 6 => 'west-vlaams rood', 7 => 'black aberdeen', 8 => 'rubia gallega', 9 => 'wagyu kobe',
10 => 'chianina' );

// je query, sla resultaten op in een array [ras][maand] => [aantal], bijvoorbeeld als volgt:
// ...
//$rasAantallen = array(
    //1 => array(6 => 2), // ras id 1: aubrac, maand 6, aantal 2
    //2 => array(6 => 3), // ras id 2: simmental, maand 6, aantal 3
    //3 => array(7 => 4), //
//);




$sql = "
   SELECT
       (SELECT CASE ras
            WHEN 'aubrac' THEN 1
            WHEN 'holsteiner' THEN 2
            WHEN 'simmental' THEN 3
        WHEN 'belgisch wit-blauw' THEN 4
        ELSE 5 END) AS ras1,
    MONTH(datum) as m,
        SUM(aantal) as s
   FROM
    wedstrijd"
;

$res = mysql_query($sql) or die (mysql_error());
                          
         while($row = mysql_fetch_assoc($res))
             {


    
$rasAantallen = array(
    
    $row['ras1'] => array($row['m'] => $row['s']), // ras id 1: aubrac, maand 6, aantal 2
        $row['ras1'] => array($row['m'] => $row['s']), // ras id 2: simmental, maand 6, aantal 3
    $row['ras1'] => array($row['m'] => $row['s']), //
);

            }






?>

<pre>
<?php print_r($rasAantallen); ?>
</pre>
<?php


$maanden
= array(1 => 'Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec');

// bouw je tabel
?>


<table id="table-gastenlijst2" class="table table-striped table-bordered" cellspacing="0" width="100%">
    <thead>
    <tr>
    <th>Ras</th><?php
    foreach ($maanden as $label) {
        ?>
<th><?php echo $label; ?></th><?php
    }
    ?>
</tr>
    </thead>
    <tbody><?php
    // doorloop alle rassen
    foreach ($rassen as $rasId => $rasNaam) {
        ?>
<tr>
        <td><?php echo $rasNaam; ?></td><?php
        // doorloop voor elk ras alle maanden
        foreach ($maanden as $maandNr => $maandLabel) {
            // als er voor dit ras en deze maand een aantal is, druk deze af, druk anders een spatie af
            if (isset($rasAantallen[$rasId][$maandNr])) {
                ?>
<td><?php echo $rasAantallen[$rasId][$maandNr]; ?></td><?php
            } else {
                ?>
<td>&nbsp;</td><?php
            }
        }

        ?>
</tr><?php
    }
    ?>
</tbody>
</table>

Maar de query werkt nog niet.
Gewijzigd op 26/06/2015 14:14:00 door Brecht S
 

Pagina: 1 2 volgende »



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.