MySQL -> SUM(record) vraag

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marijke Hakvoort

Marijke Hakvoort

17/11/2011 12:48:31
Quote Anchor link
Hallo,

Ik heb in mijn database een record basic staan, waar de prijs per module in staat.
Nu heb ik dus een row met de naam van de modules en een row met de prijs van de modules, maar nu wil ik dus ook een totaalprijs van de modules krijgen.

In mijn query kan ik niet een totaal op deze manier krijgen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
SELECT
list_modules.basic AS price,
SUM(list_modules.basic) AS total

....
?>


Heeft iemand suggesties hoe ik dit kan aanpakken?

Toevoeging op 17/11/2011 12:49:08:

Los van elkaar werkt het trouwens natuurlijk wel,
maar op de manier die ik aangaf geeft hij meteen het totaal aan en niet eerst de prijs per module.
 
PHP hulp

PHP hulp

24/11/2024 06:02:52
 
Kees Schepers

kees Schepers

17/11/2011 13:21:08
Quote Anchor link
Los van het feit dat het je niet lukt wat is precies het probleem waar je tegenaan loopt? Dus krijg je een foutmelding oid? En wat is je volledige query.
 
Marijke Hakvoort

Marijke Hakvoort

17/11/2011 13:26:19
Quote Anchor link
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
<?php
 public function getPrice($adminid){
        $result = mysql_query("
             SELECT
             list_modules.nl AS name,
             lnk_administrations_modules.id_administration AS id_admin,
             list_modules.basic AS price
                                            
             FROM
             lnk_administrations_modules
             Inner Join list_modules ON lnk_administrations_modules.id_module = list_modules.id
             WHERE
             id_administration = "
.$adminid) or die(mysql_error());
                    
        echo "<table>";
        while( $overzicht = mysql_fetch_array( $result ) ){
            echo "<tr><td class=dark>".$overzicht['name'] ."</td>
            <td class=dark>"
.$overzicht['price']."</td></tr>";
        }

        echo "<tr><td class=dark>Totaal:</td>
        <td class=dark>"
.TOTAAL."</td></tr>  ";
        echo " </table>";

?>


Daar waar ik TOTAAL heb staan zou ik dus het totaalbedrag willen hebben,
maar ik weet niet hoe ik dus de basic (of price zoals ik het genoemd heb) eerst los in een array kan krijgen maar daarna vervolgens ook een SUM erop kan toepassen.

Hij geeft nu netjes de modules en de prijs ervan weer in een tabel,
alleen met het totaalbedrag heb ik dus even problemen.

Toevoeging op 17/11/2011 13:29:00:

Overigens voor de rest geen foutmeldingen,
zo staat het niet in mijn originele script met TOTAAL, want dan zou ik een foutmelding krijgen natuurlijk.

Nu komt er dus zoiets uit:

Module1 €10
Module2 €15
Module3 €40

...

Nu wil ik dus hieronder
Totaal: €totaalbedrag

Met de SUM fuctie erbij, uitgevoerd op basic (price) krijg ik dit:

Module1 €65
 
Kees Schepers

kees Schepers

17/11/2011 15:03:17
Quote Anchor link
Met array_sum kun je gemakkelijk alles bij elkaar op tellen zie onderstaand. Het kan namelijk niet makkelijker met 1 query, of ik vergis me. Heb ook je code wat verbeterd en je query beschermt tegen SQL injectie:

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
<?php
 public function getPrice($adminid) {
    $sql = "
        SELECT
            list_modules.nl AS name,
            lnk_administrations_modules.id_administration AS id_admin,
            list_modules.basic AS price                                            
        FROM    
            lnk_administrations_modules
        INNER JOIN
            list_modules ON lnk_administrations_modules.id_module = list_modules.id
        WHERE
            id_administration = %d"
;

        $result = mysql_query(sprintf($sql, $adminid)) or die(mysql_error());
                    
        echo "<table>";
        $totals = array();
        while( $overzicht = mysql_fetch_array( $result ) ){
        $totals[] = $overzicht['price'];

            echo "<tr><td class=dark>" . $overzicht['name'] . "</td>
             <td class=dark>"
. number_format($overzicht['price'],2,",",".") . "</td></tr>";
        }


        echo "<tr><td class=dark>Totaal:</td>
        <td class=dark>"
. number_format(array_sum($totals),2, ",", ".") . "</td></tr>  ";
        echo " </table>";
}

?>
Gewijzigd op 17/11/2011 15:04:10 door kees Schepers
 
Marijke Hakvoort

Marijke Hakvoort

17/11/2011 15:14:36
Quote Anchor link
Helemaal geweldig! Super bedankt Kees!
Ik snap alleen niet waar in de query de %d voor staat, en hoe heb je dat nou precies opgelost? alleen maar door het in een array te zetten en erna uit te rekenen met array_sum?
 
Kees Schepers

kees Schepers

17/11/2011 15:27:15
Quote Anchor link
Wat betreft de %d, dit is om ervoor te zorgen dat $adminid altijd een nummer is om SQL injection tegen te gaan. Het is belangrijk hier je in te verdiepen want het vormt een van de grootste risico's voor websites. Er is heel veel over te vinden op Google etc.

En over de array_sum, ik doe eerst inderdaad alle prijzen in een array zetten en vervolgens uitrekenen met array_sum, zo simpel is het haha.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

17/11/2011 16:19:32
Quote Anchor link
Kees, waarom in een array, je kan het toch ook in een var zetten en die telkens optellen met de prijs?

Toevoeging op 17/11/2011 16:41:59:

Overigens is het ook mogelijk in de query zoals Marijke deed
 
Kees Schepers

kees Schepers

17/11/2011 17:18:59
Quote Anchor link
Ger, een array omdat je dan iets meer vrijheid hebt maar optellen in een variabele zou ook voldoen. In een query kan inderdaad wel maar dan zul je of een tweede query moeten maken of een subquery dus performance technisch is dat minder interresant.
 



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.