[PHP/MySQL] Hoe values optellen uit verschillende rijen?

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • chefspecial
  • Registratie: September 2014
  • Laatst online: 01-09 10:15
Ik heb een webshop(je) en in de tabel orders_total worden alle bedragen (VAN BETAALDE ORDERS / status=24) opgeslagen.
Iedere order heeft een ID en daaronder zijn 3 bedragen gekoppeld, namelijk:
- Totaalbedrag (totaalbedrag zonder kortingen etc).
- Kortingbedrag (wanneer kortingscode ingevuld word)
- Verzendkosten (dit is altijd 0 euro!)

Nu heb ik een simpel scriptje op de admin pagina waar alle orders opgeteld in een som staan, maar hier haalt hij de kortingsbedragen niet af. Hij telt dus echt álle values op. De kortingen staan ook als value omschreven.
De tabel indeling is alsvolgt:
orders_total_id / orders_id / title / text / value / class / sort_order
Onder value staan de bedragen en kortingsbedragen. Sort_order is 4 bij de kortingsbedragen en 99 bij 'totaal' bedragen (zonder korting). Wellicht is het eenvoudig te sorteren dat hij alleen de sort_order 4 pakt?

Als voorbeeld, order ID 1=
Kolom value:
25.00 (totaalbedrag minus korting - minus korting is 20.05)
4.95 (kortingscode)
0.00 (verzendkosten)

Hij telt met het scriptje alleen het totaalbedrag op.

Nu wil ik een apart script maken met de kortingsbedragen opgeteld.

Ik kom er als PHP newbie niet uit... :'(

Dit is het script wat ik heb om de bedragen op tellen zonder korting:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$id = 24;
$totaal = €;
$select = mysql_query("SELECT orders_id FROM orders WHERE orders_status = " . $id );

        // Print out result
        while($row = mysql_fetch_array($select)){

            $sql = "SELECT orders_id, value,  FROM orders_total WHERE orders_id = " . $row['orders_id'];
            $res = mysql_query($sql);
            $result = mysql_fetch_array($res);

                $totaal = $totaal;

                                                }
echo $totaal;
$tot_qry = tep_db_query("SELECT SUM(ot.value) AS total_value FROM " . TABLE_ORDERS . " o LEFT OUTER JOIN orders_total ot ON (o.orders_id = ot.orders_id) WHERE o.orders_status IN (" . STATS_TOTALS_CUSTOMERS . ")");
$tot_res = tep_db_fetch_array($tot_qry);
echo number_format($tot_res['total_value'], 2);

?>

Alle reacties


Acties:
  • 0 Henk 'm!

  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 17-09 12:55

MAX3400

XBL: OctagonQontrol

Dit lijkt me niet PHP-gerelateerd maar MySQL-gerelateerd.

Om ook voor anderen iets meer inzicht te krijgen van jouw huidige table; is het mogelijk om een (kleine) dump in je startpost neer te zetten van 5 orders waarbij er 3 geen korting hebben, 1 1x korting en 1 order van 6 artikelen met 3x korting op 3 artikelen?

Wel even anonimiseren (geen klantdata) en mogelijk fictieve bedragen van jouw shop?

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


Acties:
  • 0 Henk 'm!

  • chefspecial
  • Registratie: September 2014
  • Laatst online: 01-09 10:15
Hier een tweetal bestellingen, 1 met kortingscode 1 zonder.
Gaat om order nummer 1 en order nummer 6. Iedere value krijgt wel een eigen orders_total_id.
Volgens mij maakt dit het idd iets duidelijker. Voor PHP/SQL kenners is dit waarschijnlijk een simpel iets, ik ben gisteren de hele dag bezig geweest.
Als ik die values (bedragen) van alleen die sort_order=4 kan selecteren en die kan laten optellen heb ik volgens mij alleen de kortingsbedragen? Maar hoe verwerk ik dat in dat script.

code:
1
2
3
4
5
6
INSERT INTO `orders_total` (`orders_total_id`, `orders_id`, `title`, `text`, `value`, `class`, `sort_order`) VALUES
(1, 1, 'Ophalen Den Helder op 11 november', ' ', '0.0000', 'ot_shipping', 2),
(2, 1, 'Korting (AFAIFM22):', '3,68EUR', '3.6750', 'ot_discount', 4),
(3, 1, 'Totaal:', '33,08EUR', '33.0750', 'ot_total', 99),
(15, 6, 'Ophalen Den Helder op 13 november:', ' ', '0.0000', 'ot_shipping', 2),
(16, 6, 'Totaal:', '67,20EUR', '67.2000', 'ot_total', 99);

[ Voor 11% gewijzigd door chefspecial op 29-11-2017 11:42 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Kijk eens naar wat je met IF kunt doen in MySQL - het enige dat je immers hoeft te doen is het bedrag van een min-teken te voorzien als het korting is.

Acties:
  • 0 Henk 'm!

  • CappieL
  • Registratie: November 2006
  • Laatst online: 16-09 08:50
Of je zorgt ervoor dat de korting-code een negatief bedrag is.

Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
chefspecial schreef op woensdag 29 november 2017 @ 09:33:
Als ik die values (bedragen) van alleen die sort_order=4 kan selecteren en die kan laten optellen heb ik volgens mij alleen de kortingsbedragen? Maar hoe verwerk ik dat in dat script.
De vraag is véél eerder waarom er aan zo'n "totaalregel" niet een type o.i.d. hangt waaraan je kunt zien dat 't een kortingsregel betreft. Hell, nog veel erger: waarom 't bedrag niet überhaupt negatief in de DB staat. En nog, nog, nog ergerderder: waarom er in hemelsnaam HTML in je orderregels staat :X
Ik weet niet wie dat systeem gebouwd heeft maar ik zou 't eens héél goed laten doorlichten op (beginners)fouten. Met deze kennis zou ik i.i.g. niet bij je webshop bestellen.

Having said that:

SQL:
1
2
select sum(case when `sort_order` = 4 then -`value` else `value` end) as `total`
from `orders_total`

Of per order:
SQL:
1
2
3
select `order_id`, sum(case when `sort_order` = 4 then -`value` else `value` end) as `ordertotal`
from `orders_total`
group by `order_id`

Zoiets. Ook prima te schrijven met een if i.p.v. een case. Waarbij je nu dus sort_order gruwelijk misbruikt om te bepalen of 't om een 'kortingsregel' gaat of niet.

[ Voor 24% gewijzigd door RobIII op 29-11-2017 10:49 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • chefspecial
  • Registratie: September 2014
  • Laatst online: 01-09 10:15
RobIII schreef op woensdag 29 november 2017 @ 10:40:
[...]

Dr vraag is véél eerder waarom er aan zo'n "totaalregel" niet een type o.i.d. hangt waaraan je kunt zien dat 't een kortingsregel betreft. Hell, nog veel erger: waarom 't bedrag niet überhaupt negatief in de DB staat. En nog, nog, nog ergerderder: waarom er in hemelsnaam HTML in je orderregels staat :X
Ik weet niet wie dat systeem gebouwd heeft maar ik zou 't eens héél goed laten doorlichten op (beginners)fouten. Met deze kennis zou ik i.i.g. niet bij je webshop bestellen.

Having said that:

SQL:
1
2
select sum(case when `sort_order` = 4 then -`value` else `value` end) as `total`
from `orders_total`

Of per order:
SQL:
1
2
3
select `order_id`, sum(case when `sort_order` = 4 then -`value` else `value` end) as `ordertotal`
from `orders_total`
group by `order_id`

Zoiets. Waarbij je nu dus sort_order gruwelijk misbruikt om te bepalen of 't om een 'kortingsregel' gaat of niet.
Kan ik die code in het al bestaande script voegen of moet dit apart?
Ik heb destijds aardig wat neer gelegd voor de shop, is inmiddels een jaar of 4-5 oud maar werkt nog steeds ;)
Helaas is de bouwer niet meer bereikbaar en kan ik het als leek oplossen :F

[ Voor 86% gewijzigd door chefspecial op 29-11-2017 10:46 ]


Acties:
  • +2 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
chefspecial schreef op woensdag 29 november 2017 @ 10:40:
Kan ik die code in het al bestaande script voegen of moet dit apart?
Ik hoop vooral dat je dit niet gaat knippen en plakken maar 't gebruikt om er iets van te leren. Het is in ieder geval niet bedoeld om te knippen/plakken.
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.
Dus: kijk wat er gebeurt in het voorbeeld dat ik geef, probeer dat te bevatten en pas het dan toe in je eigen situatie met de nodige aanpassingen zodat 't voor jou doet wat 't moet doen.
chefspecial schreef op woensdag 29 november 2017 @ 10:40:
Helaas is de bouwer niet meer bereikbaar en kan ik het als leek oplossen :F
Misschien moet je 't uitbesteden aan een niet-leek dan? ;)

[ Voor 13% gewijzigd door RobIII op 29-11-2017 10:51 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Sowieso: Waar hoort mijn topic?

WEB>>PRG

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • chefspecial
  • Registratie: September 2014
  • Laatst online: 01-09 10:15
RobIII schreef op woensdag 29 november 2017 @ 10:48:
[...]

Ik hoop vooral dat je dit niet gaat knippen en plakken maar 't gebruikt om er iets van te leren. Het is in ieder geval niet bedoeld om te knippen/plakken.


[...]


Dus: kijk wat er gebeurt in het voorbeeld dat ik geef, probeer dat te bevatten en pas het dan toe in je eigen situatie met de nodige aanpassingen zodat 't voor jou doet wat 't moet doen.


[...]

Misschien moet je 't uitbesteden aan een niet-leek dan? ;)
Dit probleem ga ik nooit oplossen, dus laat het voor wat het is. Dank voor de hulp in ieder geval ;)

Acties:
  • 0 Henk 'm!

  • BarôZZa
  • Registratie: Januari 2003
  • Laatst online: 23:57
RobIII schreef op woensdag 29 november 2017 @ 10:40:
[...]

De vraag is véél eerder waarom er aan zo'n "totaalregel" niet een type o.i.d. hangt waaraan je kunt zien dat 't een kortingsregel betreft. Hell, nog veel erger: waarom 't bedrag niet überhaupt negatief in de DB staat. En nog, nog, nog ergerderder: waarom er in hemelsnaam HTML in je orderregels staat :X
Ik weet niet wie dat systeem gebouwd heeft maar ik zou 't eens héél goed laten doorlichten op (beginners)fouten. Met deze kennis zou ik i.i.g. niet bij je webshop bestellen.
Waarom niet? Ik vermoed dat je met weinig moeite zo gratis dingen kan bestellen :7

Acties:
  • 0 Henk 'm!

  • chefspecial
  • Registratie: September 2014
  • Laatst online: 01-09 10:15
Heb net een script gemaakt en aangepast zodat hij nu de kortingsbedragen en de andere bedragen gesorteerd aangeeft.
Alleen nu moet ik nog een weg zien te vinden dat hij alleen de orders met betaalstatus 24 uit de tabel "orders" weergeeft.

code:
1
2
3
4
5
6
7
8
9
10
11
<?php
$query = "SELECT class, SUM(value) FROM orders_total GROUP BY class"; 
     
$result = mysql_query($query) or die(mysql_error());

// Print out result
while($row = mysql_fetch_array($result)){
    echo "Total ". $row['class']. " = $". $row['SUM(value)'];
    echo "<br />";
}
?>

Acties:
  • 0 Henk 'm!

  • Montaner
  • Registratie: Januari 2005
  • Laatst online: 01-09 08:19

Acties:
  • +1 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 22:36

AW_Bos

Liefhebber van nostalgie... 🕰️

En los van die queries: Het is ook zinvol om eens over te stappen naar de MySQLi-functies of PDO.
Nu gebruik je nog de oude mysql_***() functies, en die zijn in PHP 7 ter ziele gegaan. Dus als je hosting nu onverhoopt opeens PHP 7 als default in zat stellen, zal je webshop direct niet meer werken.

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

wat @AW_Bos zegt. MySQLi of PDO. Bijkomend voordeel is ook nog eens dat je niet zo vies door je result heen hoeft te loopen zoals nu gebeurt met die while-loop. Gewoon je resultaat rechtstreeks naar een associative array duwen en gaan.

Verder snap ik het probleem met de query niet helemaal? Je wil het totaal weten van je orders en het totaal van je verleende kortingen? Wat dacht je van

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
    total as totaal_orders
  , discount as totaal_discount
  , (total - discount) as totaal_orders_minus_korting
FROM (
    SELECT
        SUM(CASE
                WHEN class = 'ot_discount' THEN CAST(value AS decimal(10,4))
                ELSE 0
            END) AS discount
      , SUM(CASE
                WHEN class = 'ot_total' THEN CAST(value AS decimal(10,4))
                ELSE 0
            END) AS total
    FROM orders_total
) AS tmp;

Hoeder van het Noord-Meierijse dialect

Pagina: 1