[MySQL] Update query met geaggregeerde Subquery?

Pagina: 1
Acties:
  • 498 views sinds 30-01-2008
  • Reageer

  • tonyisgaaf
  • Registratie: November 2000
  • Niet online
Ik ben vrij nieuw in de wereld van de databases, maar ben bezig met een PHP site met daarachter een MySQL database. Omdat ik nog (lokaal) aan het ontwikkelen ben, voeg ik nog wel eens velden toe aan een tabel, om zodoende minder in PHP te hoeven uitrekenen en afhandelen. Tot nu toe kon dat telkens eenvoudig, maar nu heb ik een (voor mijzelf in ieder geval) lastige query te pakken, waar ik nog niet uitkom.

Tabel1: Payment met (primary key) PaymentID, (...) , NumberTotal
Tabel2: PaymentPart met (primary key) PaymentPartID, PaymentID, (...) , Number
Met een relatie one Payment: many PaymentPart

Nu heb ik dus later Payment.NumberTotal toegevoegd, waarbij ik de waarde hiervan wil laten vullen door de som van de bijbehorende PaymentPart.Number met dezelfde PaymentID.

Dit werkt (uiteraard):
SQL:
1
2
3
SELECT PaymentID, SUM(Number)
  FROM PaymentPart
  GROUP BY PaymentID

En geeft ook een mooie lijst met PaymentID en de som.

Dit werkt (uiteraard) niet:
SQL:
1
2
3
4
5
6
UPDATE Payment,PaymentPart
  SET NumberTotal=
    (SELECT SUM(Number)
    FROM PaymentPart
    GROUP BY PaymentID)
  WHERE Payment.PaymentID=PaymentPart.PaymentID

Error: MySQL said: #1242 - Subquery returns more than 1 row
En dat is natuurlijk ook zo, dus het probleem is (denk ik) dat ik de Payment records één voor één moet doen updaten?

Ik weet dus niet hoe het wél moet. Hoe kan er voor zorgen dat de Payment records één voor één (allemaal) worden ge-update en dat daarbij de relatie PaymentID in meegenomen wordt?

NL Weerradar widget Euro Stocks widget Brandstofprijzen widget voor 's Dashboard


Verwijderd

2 vragen: waarom haal je PaymentPart erbij wanneer je alleen een veld in Payment wilt updaten, en waarom haal je er in je subselect alle PaymentID's bij (group by...) terwijl je al weet welke PaymentID je wil hebben?

SQL:
1
2
3
4
5
UPDATE Payment
  SET NumberTotal= 
    (SELECT SUM(Number) 
    FROM PaymentPart 
    WHERE Payment.PaymentID=PaymentPart.PaymentID) 
Niet getest, want ik gebruik geen MySQL, maar volgens mij komt 't een stuk dichter in de richting van wat je bedoelt. ;)

  • tonyisgaaf
  • Registratie: November 2000
  • Niet online
Dat werkt inderdaad! Ik ben nog niet zo goed in het begrijpen van de subquery. Problemen met het "wat weet de subquery van de hoofdquery en vice versa". Weer een stapje verder nu!

NL Weerradar widget Euro Stocks widget Brandstofprijzen widget voor 's Dashboard