1.2 Inleiding
In deze tutorial worden eerst de meest gebruikte wiskundige functie's op een rijtje gezet,
en daarna verwerkt in wat geavanceerdere query's, die toch eigenlijk vrij eenvoudig zijn. Veel succes.
2.1 COUNT()
Met COUNT(`veldnaam`) kun je het aantal opgeslagen rijen tellen uit een tabel.
Dit kan handig zijn als je bijvoorbeeld het aantal leden wilt tellen van je database.
SELECT COUNT(`id`) FROM `leden`
En die bovenstaande code zal resulteren in het aantal rijen dat je in jouw database hebt.
Dit is natuurlijk te vervoegen met het WHERE statement, om zo een voorwaarde te stellen
aan de query.
COUNT() kun je het beste opvragen met mysql_result();
<?
$cQuery = mysql_query("SELECT
COUNT(`id`) FROM `leden`
WHERE `status` = 1");
$cCount = mysql_result($cQuery,0);
echo 'Deze website heeft '.$cCount.' leden.';
?>
2.2 SUM()
Met SUM(`veldnaam`) tel je alle getallen uit die kolom op. Let erop dat je dan dus alleen getallen in die kolom mag hebben.
Dit werkt dus niet zoals COUNT(), maar telt dan alle getallen bij elkaar op. Stel je hebt 5 rijen en je hebt de kolom
aantal. In deze kolom staat in dit geval bij alle 5 de rijen het getal 10. Dan wordt het resultaat van SUM() 50, want
opgeteld zijn deze 5 rijen 50 waard.
Hieronder volgt een voorbeeld hoe het in zijn werk gaat.
<?
$cQuery = mysql_query("SELECT SUM(`aantal`)
FROM `producten`");
$cAantal = mysql_result($cQuery,0);
echo 'Er zijn '.$cAantal.' producten in voorraad.';
?>
2.3 AVG()
Met AVG(`veldnaam`) kun je het gemiddelde van een kolom uit kunnen rekenen. AVG staat voor average, en dat betekent in het
Nederlands gemiddeld, vandaar. Dit werkt eigenlijk netzoals SUM() en COUNT(), hieraan kun je ook een conditie stellen door middel
van WHERE. Ook hierbij kunnen alleen getallen worden gebruikt, want anders valt er niet echt een mooi gemiddelde uit te rekenen.
<?
$cQuery = mysql_query("SELECT AVG(`aantal`) FROM `producten`");
$cAverage = mysql_result($cQuery,0);
echo 'Er zijn gemiddeld '.round($cAverage,1).' stuks van elk soort aanwezig.';
// round() speelt hier een aardig belangrijke rol,
// want de meeste getallen worden niet mooi afgerond.
?>
2.4 MIN() en MAX()
Met deze twee functie's kun je het hoogste en het laagste invoer van een veld opvragen. Dat is handig als je bijvoorbeeld
het goedkoopste en/of product uit je database wil selecteren.
<?
$maxQuery = mysql_query("SELECT MAX(`prijs`) FROM `producten`");
$minQuery = mysql_query("SELECT MIN(`prijs`) FROM `producten`");
$maxReturn = mysql_result($maxQuery,0);
$minReturn = mysql_result($minQuery,0);
2.5 ROUND(), FLOOR() en CEILING()
Deze functie's werken netzoals in php, dus veel verschil zal er niet in zitten. Alleen in php heeft CEILING() een andere benaming,
namelijk ceil(). Tevens kun je alleen bij ROUND het aantal getallen na de komma
instellen, dit is niet mogelijk bij de andere twee.
ROUND(integer,aantal)
Dit zal het getal naar boven of naar beneden afronden, met aantal achter de komma.
FLOOR(integer)
Floor rond het getal naar beneden af, zonder getal achter de komma.
CEILING(integer)
Ceiling zal het getal afronden naar boven, ook zonder een getal achter de komma.
<?
$rQuery = mysql_query("SELECT ROUND(`prijs`,2) FROM `producten` WHERE `id` = 1");
// Zal bij de output een getal met 2 cijfers achter de komma retourneren
$fQuery = mysql_query("SELECT FLOOR(`prijs`) FROM `producten` WHERE `id` = 1");
// Zal bij de output een getal afgerond naar beneden retourneren
// Dus 2,8 wordt dan 2.
$cQuery = mysql_query("SELECT CEILING(`prijs`) FROM `producten` WHERE `id` = 1");
// Zal de output afronden naar boven,
// Dus 2,3 wordt 3.
?>
3.1 Functie's samenvoegen
Nu we de meest gebruikte functie's even op een rijtje hebben gezet, zou je wat
geavanceerdere query's kunnen uitvoeren. En deze worden dan meestal gebruikt in bijvoorbeeld
een voorraad systeem van een winkel. En bij deze tutorial gaan we de volgende tabel gebruiken.
id
naam
aantal
prijs
verkocht
korting
1
Agenda
25
10
6
10
2
Etui
10
3
5
60
3
Schooltas
88
50
56
0
4
Schriftjes
50
1
25
0
3.2 Optellen en aftrekken
Nu eerst de basis, stel je wil een rij krijgen waarin alle producten staan, met het aantal resterende
producten dat nog in de winkel is. Dan kun je het beste gewoon in de query zelf de rekensom maken. Hieronder
volgt een voorbeeld hoe dat in z'n werk zou moeten gaan.
<?
$pSql = mysql_query("SELECT *,
(`aantal` - `verkocht`) AS `resterend`
FROM `producten`") or die(mysql_error());
// Met AS kun je wat je links doet benamen tot wat er recht staat
// Dus aantal minus verkocht dat kun je dan later opvragen met resterend
// in dit geval, dit is gewoon handig + nodig.
while($pRow = mysql_fetch_assoc($pSql))
{
echo $pRow['naam'].' ('.$pRow['resterend'].' resterend van de '.$pRow['aantal'].')<br />';
// Nu echo je eigenlijk gewoon een rijtje met daarin het aantal resterende producten
// In bijvoorbeeld de rij met ID #1 (Agenda) zal dat 19 retourneren, want 25 - 19 is
// immers 6 ;-).
}
?>
Dat wat hierboven stond is wel een heel erg simpel voorbeeld, maar het laat toch zien hoe eenvoudig het
in mysql werkt, en dat je daarom dus niet moeilijk hoeft lopen te doen met onnodige blokken php code.
Nu zul je wel eens weten wat je winst is, dus het aantal producten dat je verkocht hebt maal de prijs van het
product, nu nog even zonder korting om het wat eenvoudiger te houden. Nu is het dus de bedoeling dat je het
aantal verkochte producten opvraagt, en dit maal de prijs van het product doet.
<?
$wSql = mysql_query("SELECT *,
(`verkocht` * `prijs`) AS `winst`
FROM `producten`")
or die(mysql_error());
// Ahzo fijn, hier neemt hij het aantal producten die zijn verkocht
// en vermenigvuldigd dit met de prijs van 't product, en zo komt hij
// tot de nieuwe naam winst, door middel van AS.
while($wRow = mysql_fetch_assoc($wSql))
{
echo 'Er is €'.$wRow['winst'].' winst gemaakt bij het product '.$wRow['naam'].'.<br />';
}
?>
Dit stelt eigenlijk helemaal niets voor, dat had je zelf zo ongeveer ook wel kunnen bedenken.
Nu kan 't wel eens interessant zijn dat je totaal statistieken komt te weten, en dan wel uit één
query te verstaan. Dus dat gaan we dan ook maar eens proberen ;-).
<?
$sSql = mysql_query("SELECT
(SUM(`aantal`) - SUM(`verkocht`)) AS `resterend`,
ROUND(AVG(`prijs`),1) AS `gemiddeld`,
MAX(`verkocht`) AS `meestverkocht`
FROM `producten` LIMIT 0,1") or die(mysql_error());
// Dit lijkt veel, maar dit valt in feite nog wel mee,
// het lijkt alleen wat groter door de hoeveelheid
// berekeningen en functie's.
$sRow = mysql_fetch_assoc($sSql);
echo 'Er zijn nog '.$sRow['resterend'].' producten aanwezig.<br />';
echo 'De gemiddelde prijs van deze producten is '.$sRow['gemiddeld'].'.<br />';
echo 'Van 1 product zijn maarliefst '.$sRow['meestverkocht'].' stuks verkocht!<br />';
// Vrij domme statistieken, maar enkel te illustratie hoe het zou kunnen werken
?>
3.3 Percentage berekenen
En dan nu het berekenen van het percentage korting per product, want wat hiervoor allemaal ging is eigenlijk
niet zo moeilijk, lijkt me.
<?
$kSql = mysql_query("SELECT *,
(`prijs` - ((`prijs` / 100) * `korting`)) AS `nieuwprijs`
FROM `producten` WHERE `korting` >= 1 ORDER BY `naam` ASC")
or die(mysql_error());
while($kRow = mysql_fetch_assoc($kSql))
{
echo 'Nieuwprijs van '.$kRow['naam'].' met '.$kRow['korting'].'% korting: €'.$kRow['nieuwprijs'].'.<br />';
}
?>
3.4 Het gebruik van haakjes
Het gebruik van haakjes is zeer belangrijk, netzoals je bij wiskunde ooit hebt gehad. Als je het toevallig weet,
dan heeft de wiskunde een bepaalde volgorde, en daar is zo'n ezelsbruggetje voor, genaamd MVDWOA (Meneer Van Dale Wacht Op Antwoord).
En dit geeft dan een volgorde aan van hoe alles moet, maar deze manier klopt niet. De volgorde is WMDVAO, om correcte redenen,
waar ik verder ook niet op in ga, want het gebruik van haakjes moet dit juist voorkomen.
Zoals je bij 3.3 hebt gezien is dat ik eerst de prijs min de prijs gedeeld door 100 maal percentage korting. Heel eenvoudige functie,
maar kan wel fouten veroorzaken zonder het gebruik van deze haakjes. Dit geld voor meerdere query's, maar het is maar eventjes dat je
weet en niet weer vergeet.
Ik hoop dat ik nu zo'n beetje de basis heb uitgelegd, of wat meer daar van. Als je vragen hebt kun je het beste deze stellen op het daarvoor bestemde forum.