[PHP/MYSQL]Optellen van data uit 2 tabellen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Alm4riC
  • Registratie: Februari 2005
  • Laatst online: 17-09 22:16
Hallo,

Ik heb vraag rondom het optellen van data uit verschillende tabellen. Er zijn twee tabellen genaamd order & product.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Order:
 order_id   |  number  |  product_id
-------------------------------------------------
     1         |      5       |       7
-------------------------------------------------
     2         |      2       |       6

Product
 product_id   |  price |  
--------------------------------
     7            |      10  |   
--------------------------------
     6            |      20  |


Nu wil ik graag de totaal prijs van een bestelling berekenen. Nu dacht ik dit te toen met een enkele query, alleen dit blijkt niet te werken omdat de subquery dan meer dan 1 resultaat terug geeft.
De uitkomst zou dus 90 moeten zijn..
code:
1
2
3
4
5
6
7
8
9
10
SELECT SUM(number*(
               SELECT products.price 
               FROM temporary 
               LEFT JOIN products 
               ON temporary.product_id=products.product_id 
               WHERE temporary.session_id = '".$session_id."'
                                )) 
AS total 
FROM temporary 
WHERE temporary.session_id = '".$session_id."' ")

vergeef me mijn misschien, brakke mysql query. k ben niet zo goed met subquery's en dergelijke :P
Nu is mijn vraag, hoe kan ik dit het beste aanpakken. Is dit mogelijk met 1 query, of zal ik toch meerdere query's moeten gaan gebruiken?

dank _/-\o_

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
[google=group by]?
En daarnaast bijvoorbeeld een natural join gebruiken.

[ Voor 60% gewijzigd door pedorus op 28-05-2008 18:01 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Inderdaad GROUP BY gebruiken, zie ook de Mysql Manual: GROUP BY (Aggegrate) Functions.

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • Alm4riC
  • Registratie: Februari 2005
  • Laatst online: 17-09 22:16
hmm ik heb even gekeken naar group by, maar telkens geeft de query:
Subquery returns more than 1 row

ik gebruik nu onderstaande query,
code:
1
2
3
4
5
6
7
8
9
10
SELECT SUM(number*(
                                  SELECT products.price 
                                  FROM temporary 
                                  JOIN products 
                                  ON temporary.product_id=products.product_id  
                                  WHERE temporary.session_id = '".$session_id."')) 
AS total 
FROM temporary 
WHERE temporary.session_id = '".$session_id."' 
GROUP BY temporary.number


het is voor het eerste keer dat ik zulke "lastige" query's probeer te maken.

Voor het geval ik het nog niet duidelijk genoeg uitgelegd heb, dit moet ongeveer de formule zijn:
(products.price * order.number)*aantal verschillende producten, dus meerdere rijen uit meerdere tabellen.

is het in dit geval misschien handiger om een loop te maken? Nadeel is wel dat er meer query's gedraait moeten worden. hoop dat jullie een oplossing hebben 8)
_/-\o_ _/-\o_

Acties:
  • 0 Henk 'm!

  • Redshark
  • Registratie: Mei 2002
  • Laatst online: 20-09 13:25
ik snap ff niet waarom je in jouw voorbeeld vindt dat de uitkomst 90 zou moeten zijn. Order 1 heeft 5 producten van een prijs van 10 en order twee heeft 2 producten van 20. Wil je niet dit terug zien:
code:
1
2
3
order_id   totaalprijs
1             50
2             40

?
snelle poging:
SQL:
1
2
3
4
5
6
select 
o.order_id
, sum(o.number * p.price)
from order o 
inner join product p on p.product_id = o.product_id
group by  o.order_id

Acties:
  • 0 Henk 'm!

  • Alm4riC
  • Registratie: Februari 2005
  • Laatst online: 17-09 22:16
en dan nog de totaalprijs van de gemaakte orders, vandaar de poging tot het gebruik van sum in mijn eerste post. Ik wil namelijk de totale orderprijs van een bepaalde gebruiker ophalen.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Wil je de totalen van de verschillende orders en dan vervolgens ook nog het totaal van alle orders? Dat kun je beter niet doen met 1 query, maar gewoon in je business logica oplossen. Daar kun je bij het afdrukken immers heel simpel zelf het totaal bij houden.

Wil je het wel met 1 query doen dan zul je enorm met unions moeten gaan lopen kloten (welke order.id wil je immers bij het totaal hebben staan)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Janoz schreef op woensdag 28 mei 2008 @ 22:26:
Wil je de totalen van de verschillende orders en dan vervolgens ook nog het totaal van alle orders? Dat kun je beter niet doen met 1 query, maar gewoon in je business logica oplossen. Daar kun je bij het afdrukken immers heel simpel zelf het totaal bij houden.

Wil je het wel met 1 query doen dan zul je enorm met unions moeten gaan lopen kloten (welke order.id wil je immers bij het totaal hebben staan)
Het laatste gedeelte is niet helemaal waar, je kan een GROUP BY WITH ROLLUP doen, zie hiervoor ook de mysql documentatie: GROUP BY Modifiers in Mysql.

Je hebt dan geen enkele union nodig. Je moet dan wel in je code het een en ander afvangen, omdat niet elke rij in je resultaat dezelfde soort informatie bevat. Het lijkt mij ook beter om het in je code af te vangen, maar het is zeker ook redelijk eenvoudig op te lossen in Mysql.

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Ach, weer zo'n typische MySQL 'extentie'. Ik denk dat het stukje code om de totalen zelf te berekenen minder werk is dan het schrijven van een filter die de vreemde rows herkend en verwerkt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 21-09 10:10

WormLord

Devver

Janoz schreef op donderdag 29 mei 2008 @ 09:05:
Ach, weer zo'n typische MySQL 'extentie'. Ik denk dat het stukje code om de totalen zelf te berekenen minder werk is dan het schrijven van een filter die de vreemde rows herkend en verwerkt.
Inderdaad, zo'n typische MySQL extensie die je ook in bijvoorbeeld Oracle en MSSQL kan vinden >:) .
Volgende keer wat minder xxx-bashen graag. (xxx = mysql, windows, php, etc., etc...).

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Oeps :D.. Vond het nogal een niet in het set gebaseerd denken passende extentie. Volgende keer opzoeken of er meer vendors zijn die deze imho nogal vreemde extentie ingebouwd hebben..

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1