[MySQL] SUM van afgeleidde per row

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • nihitsia
  • Registratie: Oktober 2002
  • Laatst online: 11-09 22:10

nihitsia

The Banana goes on always on

Topicstarter
Ik ben via Cakephp aan een systeem bezig. Ik wil een virtueel veld dat het saldo van iemand berekent. Het saldo is de som van alle transacties.

Database ziet er als volgt uit:

CREATE TABLE IF NOT EXISTS `transactions` (
`id` bigint(20) NOT NULL auto_increment,
`user_id` int(11) NOT NULL,
`amount` int(11) NOT NULL,
`datetime` datetime NOT NULL,
PRIMARY KEY (`id`)
)

CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`avatar` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)

Een user heeft meerdere transacties. De foreign key is user_id.

De SQL query die ik nu heb is:

SQL:
1
SELECT `User`.`id`, `User`.`name`, `User`.`avatar`, (SELECT SUM(`transactions`.`amount`) FROM transactions, users WHERE `transactions`.`user_id` = `users`.`id`) AS `User__balance` FROM `users` AS `User` WHERE 1 = 1 LIMIT 20


Maar dit werkt niet. Wat doe ik verkeerd?

Gamebak Specs


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
wat je de foutmelding? Of krijg je het verkeerde resultaat?

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • nihitsia
  • Registratie: Oktober 2002
  • Laatst online: 11-09 22:10

nihitsia

The Banana goes on always on

Topicstarter
Ik krijg voor elke user dezelfde balance (namelijk het totaal van alle transactions). Er moet nog ergens in de subquery gespecificeerd worden dat alleen de sum wordt gepakt van de user met het user_id waar ze in de bovenste query ook mee bezig zijn. Maar ik zou niet weten hoe.

Gamebak Specs


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Zou je niet eens gaan kijken naar joins en een group by?
Hoe werken joins?
Hoe werkt dat GROUP BY nu eigenlijk?

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!

  • nihitsia
  • Registratie: Oktober 2002
  • Laatst online: 11-09 22:10

nihitsia

The Banana goes on always on

Topicstarter
Lastige is dat CakePHP me een beetje dwingt om met subqueries te werken. Ik kan alleen binnen de haakjes werken.

Gamebak Specs


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Je queriet ook het totaalbalans in je subquery, dus erg verwonderlijk is het niet dat je voor elke user het totaal krijgt. Een lesje joins en aggregate functies zoals RobIII suggereert kan geen kwaad.

Je zou moeten denken aan zoiets (hoewel ik je afraad om op deze manier subqueries te gebruiken):
code:
1
2
3
SELECT `User`.`id`, `User`.`name`, `User`.`avatar`, user__balance.tot_amount FROM users as user, 
(SELECT SUM(`transactions`.`amount`) tot_amount FROM transactions, users WHERE `transactions`.`user_id` = `users`.`id` group by 'user.id') AS `User__balance`
 WHERE User.id = User__balance.id

[ Voor 13% gewijzigd door KabouterSuper op 03-03-2010 13:52 ]

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Waarom heb je een users- en een User-tabel? En waarom die join in de subquery?

Als het zonder joins moet, dan kan dat vast ook wel zo:
SQL:
1
SELECT `User`.`id`, `User`.`name`, `User`.`avatar`, (SELECT SUM(`transactions`.`amount`) FROM transactions WHERE `transactions`.`user_id` = `User`.`id`) AS `User__balance` FROM `users` AS `User` WHERE 1 = 1 LIMIT 20


KabouterSuper: dat gaat niet werken, want nu krijg je op de plek waar één veldje moet staan meerdere waarden terug. Het enige dat de topicstarter nodig heeft is een correlatie tussen hoofdquery en subquery.

[ Voor 21% gewijzigd door NMe op 03-03-2010 13:53 ]

'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!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 12-09 10:03

Creepy

Tactical Espionage Splatterer

(jarig!)
En even een tikje door naar PRG.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
@NME: ik had mijn post al getypt voordat TS met de opmerking kwam dat het niet als join mocht. Als je goed kijkt, dan zie je dat ik het sum-stuk als sub-tabel heb omgeschreven. Dat mag wel, maar werkt wel met een join.

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

KabouterSuper schreef op woensdag 03 maart 2010 @ 14:06:
@NME: ik had mijn post al getypt voordat TS met de opmerking kwam dat het niet als join mocht. Als je goed kijkt, dan zie je dat ik het sum-stuk als sub-tabel heb omgeschreven. Dat mag wel, maar werkt wel met een join.
Dat stond er pas na je edit, en als een join niet kan omdat hij alleen de select-list aan kan passen, dan kan jouw oplossing net zo min. :)

'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!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
haha, je hebt helemaal gelijk...ik had de foute query gepost, en gelijk daarna ge-edit. En inderdaad....ik gebruik een join.

When life gives you lemons, start a battery factory

Pagina: 1