Ik heb hulp nodig bij het optellen van waarden uit de mySql database, maar ik lees dat ik hier geen script request mag doen en het is mij niet duidelijk waar ik dat dan wel mag doen.
Ik ben geen volleerd programmeur en heb enkel de basis een beetje onder de knie.
Wie wil mij helpen?

Groet,

Nanno
Hoi Arien,

Er stond in de info dat ik geen script request mocht doen, maar ik begrijp dat je me hier dus wel wil en kan helpen.

Het gaat niet enkel om 1 ding op te tellen. Ik heb ook al zitten stoeien met COUNT, maar ik raak helemaal in de war door de manier van filteren. Hoe ik dit in mijn string plaats...

Ik heb de tabel Kaarten en de kolommen 'Voorstelling_id', 'Aantal_Kaarten' en 'Betaald_kenmerk'.

Nu wil ik alle kaarten tellen die Voorstelling_id: 1 hebben en met het Betaald_kenmerk: KP.
Dit is mijn poging van mijn code. Het aantal KP weergeeft hij goed, maar het aantal kaarten blijft nul.
Wil je me helpen dit logisch te maken?

$totaal_KP_kaarten = 0;

$resultaat_KP = mysqli_query($connect_agenda, "SELECT COUNT(Aantal_Kaarten) FROM Kaarten WHERE Voorstelling_id = $artiest_id AND Betaald_kenmerk = 'KP' AND Crediteer='Nee'");

while ($row_KP = mysqli_fetch_array($resultaat_KP))
{
$totaal_KP = mysqli_num_rows($resultaat_KP);
$totaal_KP_kaarten = $totaal_KP_kaarten + $row_KP['Aantal_Kaarten'];
}
echo'
Om te beginnen de verwarring: in het Nederlands heb je "tellen" en "optellen".

Tellen doe je met bijvoorbeeld auto's: hoeveel auto's rijden er dit uur door de straat?
Dat is steeds +1 op het moment dat er eentje langsrijdt.

Maar optellen doe je met het aantal inzittenden: 1 + 1+ 4 + 4 etc

Of in database termen: Tellen doe je met het aantal records
optellen met de inhoud van een (numerieke) kolom

Engels: tellen >> count; optellen >> sum
Zo te zien heb jij hier sum nodig

De query zou moeten zijn:

SELECT 
   SUM(Aantal_Kaarten) AS aantal 
FROM Kaarten 
WHERE Voorstelling_id = $artiest_id 
  AND Betaald_kenmerk = 'KP' 
  AND Crediteer='Nee'


mysqli_num_rows() zal altijd 1 zijn: je krijgt immers 1 getal terug (de sommatie)
Die sommatie kan 100 zijn, 89 of misschien wel 0.
Maar het is altijd 1 getal.

Ik heb hierboven een alias gebruikt : AS aantal

Dat betekent dat je middels een fetch() functie een kolom in PHP kunt verwachten met de naam "aantal"

In jouw geval had je $row_KP[0] misschien kunnen gebruiken, of $row_KP['COUNT(Aantal_Kaarten)'] Maar dat is over het algemeen niet handig: een alias is handiger,
maar dan nog klopte je query niet.

En daar komt de alias weer om de hoek: als je achteraf de query aanpast wil je niet je hele code doorlopen om de betreffende functie-aanroep in allerlei array-indexes ook aan te passen.
Whow, mooie en lange uitleg.

Nou snap ik inderdaad waar ik door in de war raak, optellen en tellen, daar gaat het in mijn hoofd fout.

En daar zit dus ook de uitdaging, ik wil de aantal kaarten optellen en het aantal KP tellen.

Kan ik dit in 1 query of doe ik dit in 2?
Deze code heeft geen invloed op de rest van het script. Ik heb een pagina met een overzicht van het aantal reserveringen voor een voorstelling.
Dus in de database Kaarten staan alle bestellingen.

Pietje heeft id 1 en heeft 4 kaarten besteld voor voorstelling_id 12 en hij betaald met pin (KP).
Klaasje heeft id 2 en heeft 6 kaarten besteld voor voorstelling_id 12 en hij betaald contant(KC).
Jantje heeft id 3 en heeft 2 kaarten besteld voor voorstelling_id 12 en hij betaald met pin (KP).

Nu wil ik dus het resultaat hebben van het aantal kaarten die gepind zijn.
Dus 2 x KP = 6 kaarten.

Dit is wat ik probeerde te doen.
Het gekke is dat de numrows wel het aantal KP (Betaald_kenmerk) juist wist te tellen.

Wil je hier nog eens naar kijken voor me of de code dan van toepassing is?
In ieder geval bedankt voor je uitgebreide reactie.
Zes jaar geleden vroeg je iets vergelijkbaars.
https://www.phphulp.nl/php/forum/topic/optellen-in-mysql-database/99949/
Ik heb het voorbeeld wat uitgebreid met deze mysql data:

DROP TABLE IF EXISTS `kaartjes`;
CREATE TABLE `kaartjes` (
  `klant_id` int(10) NOT NULL AUTO_INCREMENT,
  `klant_naam` varchar(100) NOT NULL,
  `klant_aantal` int(10) NOT NULL,
  `prijs` decimal(5,2) NOT NULL,
  `Voorstelling_id` int(10) NOT NULL,
  `Betaald_kenmerk` char(5) NOT NULL,
  `Crediteer` char(5) NOT NULL,
  PRIMARY KEY (`klant_id`),
  UNIQUE KEY `klant_id` (`klant_id`),
  KEY `klant_naam` (`klant_naam`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `kaartjes` (`klant_id`, `klant_naam`, `klant_aantal`, `prijs`, `Voorstelling_id`, `Betaald_kenmerk`, `Crediteer`) VALUES
(1,	'Jansen, G.J',	2,	7.00,	1,	'KP',	'Nee'),
(2,	'Klaveren, K. van',	3,	9.50,	1,	'KC',	'Ja'),
(3,	'Pietersen, M.',	5,	10.00,	2,	'KP',	'Nee'),
(4,	'Zegwaard, K.L. van',	3,	10.00,	2,	'KC',	'Ja'),
(5,	'Rompaai, Jan van',	2,	10.00,	2,	'KP',	'Nee'),
(6,	'Zegwaard, K.L. van',	2,	25.00,	7,	'KL',	'Nee');


SELECT * FROM kaartjes;

SELECT klant_id,
klant_naam ,
prijs,
COALESCE( SUM(klant_aantal), 0) AS aantal,
COALESCE( SUM(klant_aantal * prijs ), 0 ) AS totaal,
Voorstelling_id,
Betaald_kenmerk,
Crediteer
FROM kaartjes WHERE Voorstelling_id <> 0
GROUP BY Voorstelling_id, klant_id
ORDER BY klant_naam ASC, Voorstelling_id;

SELECT Betaald_kenmerk AS kenmerk, SUM(klant_aantal ) AS aantal FROM kaartjes WHERE Betaald_kenmerk = 'KP';

SELECT Betaald_kenmerk AS kenmerk, SUM(klant_aantal ) AS aantal FROM kaartjes GROUP BY Betaald_kenmerk;


[size=xsmall]Toevoeging op 08/02/2022 16:52:56:[/size]

En voor het gemak een webpagina.
Het connect.php bestand maakt een verbinding met new mysqli();
 <!DOCTYPE HTML>

<html>

<head>

<title>Kaartjes</title>

<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />

<meta name="viewport" content="user-scalable=1, width=device-width, initial-scale=1.0, maximum-scale=2.0, minimum-scale=1.0" />

<style>
html {
	font-size: 13px;
	}
body:before {
	content: "";
	position: fixed;
	top: -10px;
	left: 0px;
	width: 100%;
	height: 10px;
	z-index: 100;
	-webkit-box-shadow: 0px 0px 10px rgba(0,0,0,.8);
	-moz-box-shadow: 0px 0px 10px rgba(0,0,0,.8);
	box-shadow: 0px 0px 10px rgba(0,0,0,.8);
}

div#container {
	font-family: Futura;
	font-size: 1.0em;
	max-width: 550px;
	border: 0.100em solid red;
	padding: 1.000em;
	margin: 1.000em auto;
	background-color: ivory;
	-webkit-box-shadow: 0px 0px 10px rgba(0,0,0,.8);
	-moz-box-shadow: 0px 0px 10px rgba(0,0,0,.8);
	box-shadow: 0px 0px 10px rgba(0,0,0,.8);
}
table, th, td {
	border: 0.100em solid navy;
	border-collapse: collapse;
	}

table {
	width: 100%;
	}

th {
	text-align: left;
	background-color: #dcdc00;
	}

th, td {
	padding: 0.500em;
	}

tr:nth-child(odd) {
	background: #dcdcdc;
	}

tr:nth-child(even) {
	background: #dcdcaa;
	}

tr.footer {
	background: #dcdc00;
	}
tr.footer td:nth-child(3),
tr.footer td:nth-child(4) {border-top: 0.300em solid navy !important;}

td.right {text-align: right;}
</style>
</head>

<body>

<div id="container">

<h2>Kaartverkoop</h2>

<table style="border:0.100em solid red;width:100%;">

<thead>
	<tr>
		<th style="text-align: left;">Klant</th>
		<th style="text-align: right;">Prijs</th>
		<th style="text-align: right;">Aantal</th>
		<th style="text-align: right;">Totaal</th>
		<th>Voorstelling</th>
		<th>Betaald</th>
		<th>Crediteer</th>
	</tr>
</thead>

<?php

include ('connect.php');
if ( $db_result )
{
	$query = "SELECT klant_id,
	klant_naam ,
	prijs,
	COALESCE( SUM(klant_aantal), 0) AS aantal,
	COALESCE( SUM(klant_aantal * prijs ), 0 ) AS totaal,
	Voorstelling_id,
	Betaald_kenmerk,
	Crediteer
	FROM kaartjes WHERE Voorstelling_id <> 0
	GROUP BY Voorstelling_id, klant_id
	ORDER BY klant_naam ASC, Voorstelling_id;";

	if ( $result = $db->query( $query ) )
	{
		while( $row = $result->fetch_object() )
		{
		?>
		<tr>
			<td><?php echo $row->klant_naam; ?></td>
			<td style='text-align: right;'><?php echo $row->prijs; ?></td>
			<td class='right'><?php echo $row->aantal; ?></td>
			<td class='right'><?php echo $row->totaal; ?></td>
			<td class='right'><?php echo $row->Voorstelling_id; ?></td>
			<td class='right'><?php echo $row->Betaald_kenmerk; ?></td>
			<td class='right'><?php echo $row->Crediteer; ?></td>
		</tr>
		<?php
		}
	}

	$query = "SELECT 
	SUM(klant_aantal) AS aantal,
	SUM(klant_aantal * prijs) AS totaal
	FROM kaartjes WHERE Voorstelling_id <> 0;";

	if ( $result = $db->query( $query ) )
	{
		while( $row = $result->fetch_object() )
		{
		?>
		<tr class='footer'>
			<td>Totaal</td>
			<td></td>
			<td class='right'><?php echo $row->aantal; ?></td>
			<td class='right'><?php echo $row->totaal; ?></td>
			<td></td>
			<td></td>
			<td></td>
		</tr>
		<?php
		}
	}
}
?>
</table>

</div>

</body>

</html>
@Adoptive:
op regel 35 missen wat kolommen in de group-by: daar moeten alle kolommen die geen SUM/COUNT etc bevatten genoemd worden.

dus GROUP BY klant_id, klant_naam, prijs, voorstelling_id, Betaald_kenmerk, Crediteer

Het ophalen van alle betaaldata kán in 1 query.
De vraag is, of je dat wilt.
Als je alleen de printransacties wilt hebben, dan heeft het ophalen en groupby-en op transactiesoort geen zin.
Maar als je wilt weten dat er 35 tickets verkocht zijn (voor het aantal stoelen) is het minder interessant dat Piet er 4 besteld heeft en Janneke 2.

@Ivo

Ik heb dat overzicht al van de namen en aantal kaartjes met daaronder opgeteld het totaal aantal kaarten voor die voorstelling.

Voor de boekhouder wil ik op die pagina een beknopt overzicht erbij plaatsen hoeveel kaarten er gepind zijn, en hoeveel er contant zijn betaald.

Ik ga hier eens even mee stoeien, denk dat ik het nu beter begrijp.

@Adoptive

Tof dat je me hier zo uitgebreid mee helpt. Ja ik vroeg dat jaren geleden ook en bemerk dat ik moeite heb met rekenen. Die hersenen snappen het dan niet en zag inderdaad het verschil niet in tellen en optellen. Dat nu wetende maakt het al een stuk eenvoudiger.

[size=xsmall]Toevoeging op 08/02/2022 18:05:44:[/size]


SELECT 
   SUM(Aantal_Kaarten) AS totaalaantal,
   Betaald_kenmerk
FROM Kaarten
GROUP BY 
   Betaald_kenmerk
WHERE 
   Voorstelling_id = 123


Dat zou iets opleveren als
4 PIN
28 CASH
3 Creditcard

Maar dat is dus niet te combineren met wíe heeft dan 4 en 8 kaarten gekocht.
@Ivo en Adoptive

Ik ben eruit... Ik moest even in mijn hoofd afstand doen en omschakelen.
Dank voor jullie hulp!!!


Ik heb nu deze code:
<?
	$resultaat_KP = mysqli_query($connect_agenda, "SELECT Betaald_kenmerk AS kenmerk, SUM(Aantal_Kaarten) AS aantal, COUNT(Betaald_kenmerk) AS kenmerk_aantal FROM Kaarten WHERE Betaald_kenmerk = 'KP' AND Crediteer='Nee'");

	while ($row_KP = mysqli_fetch_object($resultaat_KP))
		{
		$totaal_KP_kenmerk = $row_KP->kenmerk;
		$totaal_KP = $row_KP->kenmerk_aantal;
		$totaal_KP_kaarten = $row_KP->aantal;
		}

echo'Totaal kaarten via Pin: '.$totaal_KP_kaarten.' ('.$totaal_KP_kenmerk.')  Aantal pinbetalingen: '.$totaal_KP.'';
?>


Met dit als resultaat:
nee.

Je mist group by in je query.
Dat geeft met beroerd ingestelde Mysql servers weliswaar geen foutmelding, maar wel min of meer random resultaten.

In dit geval valt dat niet op, omdat je maar 1 kenmerk hebt: die staat in de WHERE.
Maar als je er WHERE Betaald_Kenmerk IN ('KP', 'KC')
van maakt, dan ben ik benieuwd hoe dan de getallen erbij verschijnen.
(dus zonder group-by geen losse kolommen selecteren, of de losse kolommen in je group-by opnemen)

Ik heb ooit een stuk hierover geschreven:
https://www.phphulp.nl/php/tutorial/databases/group-by/846/

Reageren