[SQL] Groeperen van bepaalde records

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Raegin
  • Registratie: September 2003
  • Laatst online: 14-09 12:34
Ik zit met een kwestie waar ik na twee dagen nog niet uit kom. Voor vrienden onderling heb ik een website waarop men kan aangeven wie nog geld van wie krijgt.

In de huidige versie worden transacties simpelweg in een lijst weergegeven:

SQL:
1
2
3
4
5
SELECT b.username AS username, c.username AS crediteur, *
FROM overzicht AS a
LEFT JOIN user as b ON b.user_id=a.user_id
LEFT JOIN user as c ON c.crediteur_id=a.crediteur_id
WHERE a.user_id = '$currentUserID' AND status = '1' AND paid = '0';


Dit werkt in principe prima maar voor een nieuwe versie wil ik transacties tussen twee gebruikers groeperen en de bedragen met elkaar verrekenen. Als er tussen twee gebruikers maar 1 transactie is wordt deze los weergegeven.
Ik had bedacht om binnen de sql-query een loop uit te voeren om zo per gebruikercombinatie mogelijke transacties te groeperen maar dit is niet mogelijk volgens mij.

Weet iemand een mogelijke oplossing om mij in de goede richting te sturen?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Met de huidige informatie die je geeft en de erg karige informatie die we kunnen afleiden uit je query kunnen we erg weinig. Het zou handig zijn als je even vertelt hoe je tabellen in elkaar steken e.d. Verder dan dat kan ik je enkel nog verwijzen naar onze Programming FAQ - SQL waar één en ander in uitgelegd staat en je vertellen dat je dit waarschijnlijk niet in de query wil oplossen maar in je business logica.

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!

Verwijderd

Je zou in plaats van onderscheid te maken tussen de user/crediteur het ook kunnen opslaan met een veld voor het laagste userId en een voor het hoogste userId. Zo weet je dat 2 gebruikers altijd op dezelfde 2 velden terug te vinden zijn. Vervolgens kun je een positief getal aangeven wanneer de eerste gebruiker de 2e wat schuldig is, en een negatief getal wanneer dit andersom is.
Als je vervolgens het totale bedrag wilt weten tel je gewoon alle resultaten met de zelfde userid's bij elkaar op, wanneer het positief is is de eerste de tweede nog wat schuldig en wanneer het negatief is andersom.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je 2 lijsten maakt, een met records in de vorm van Persoon1, Persoon2, MoetNogBetalen, en dan een 2e lijst met dezelfde waardes maar alleen getransformeerd naar Persoon2, Persoon1, -MoetNogBetalen ( Dat is dus het bedrag dat je nog moet ontvangen ). Als je een Union van die 2 lijsten neemt en groepeert op veld 1 en 2, en een sommatie neemt van het 3e veld, dan krijg je het saldo dat er nog tussen mensen open staat.

edit:
Ik bedoel dus dat je 1 select maakt met de Crediteur rijen, en 1 met de Debiteur rijen ( De inverse van de crediteuren ). Als je die combineert kun je daar makkelijk het saldo uit berekenen

[ Voor 19% gewijzigd door Woy op 19-10-2011 12:56 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Raegin
  • Registratie: September 2003
  • Laatst online: 14-09 12:34
Het uitrekenen van het saldo is eigenlijk het probleem niet echt, dit moet wel lukken met php maar meer hoe ik de transacties van twee gebruikers bij elkaar krijg.

Nog even ter verduidelijking, ik heb de volgende twee tabellen.

Overzicht:
overzicht_id
user_id
crediteur_id
bedrag
reden
status
paid
createdate

User:
user_id
crediteur_id
username

Waarbij user_id en crediteur_id in de user table eigenlijk hetzelfde zijn, nog te optimaliseren.