[SQL] Tabellen joinen, dubbele entries voorkomen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • IceM
  • Registratie: Juni 2003
  • Laatst online: 11-09 20:35
Om mijn probleem uit te leggen heb ik de volgende testdatabase gebruikt:
Gebruikers
idnaam
1Test


Berichten
idgebruikersidnaam
11Bericht1
21Bericht2


Status
idgebruikersidstatus
11Status1


Opzet is dat 1 gebruiker meerdere berichten en meerdere statussen kan hebben. Om het overzicht te verkrijgen van 1 gebruiker wil ik alle data in 1 keer selecteren. Ik dacht dit middels joins te doen maar ik loop daarbij tegen het probleem op dat er dubbele content in mijn resultset terugkomt. Op dit moment gebruik ik de volgende testquery:
SQL:
1
2
3
4
5
SELECT gebruikers.naam, berichten.bericht, status.status
FROM gebruikers
LEFT JOIN berichten ON gebruikers.id = gebruikers.id
LEFT JOIN status ON status.gebruikersid = gebruikers.id
WHERE gebruikers.id =  '1'


Als resultaat krijg ik dan uiteraard de volgende twee rijen terug:
Test - Bericht1 - status1
Test - Bericht2 - status1

Ik snap wel waarom ik dit resultaat terugkrijg maar als ik vervolgens de data om wil zetten naar objecten moet ik allemaal checks invoeren om te kijken of ik niet toevallig 2x dezelfde status toevoeg aan de gebruiker. Is de query zo aan te passen zodat ik bijvoorbeeld onderstaand resultaat krijgt?

Test - Bericht1 - status1
null - Bericht2 - null
Of
Test - Bericht1 - status1
Test - Bericht2 - null

...


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
Doe dan een INNER JOIN vanuit statussen.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
JOIN volgorde maakt echt niet uit, het blijven one-to-many relaties.

{signature}


Acties:
  • 0 Henk 'm!

  • BSTNjitRam
  • Registratie: November 2004
  • Laatst online: 10:37
Haal apart de berichten per gebruiker en de statussen per gebruiker op en verwerk deze dan in je gebruikerobject. Je gaat namelijk heel veel onnodige data bij elkaar verzamelen als je straks meerdere statussen én meerdere berichten hebt.

Bv bij 4 statussen en 4 berichten wil je 8 records verwerken.
Echter ga je 16 records terugkrijgen welke je dan weer wil gaan filteren.
En dit loopt hard op bij nóg hogere getallen.

[ Voor 5% gewijzigd door BSTNjitRam op 16-08-2011 20:50 ]

Wishlist Backpack Survivors op Steam !


Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

Wat is de betekenis van 'status' ?

Is het de status van de gebruiker? > Waarom zijn dan meerdere statussen mogelijk?

zoals hierboven ook vermeld, als er geen relatie is tussen berichten en status, dan is het logischer/netter/handiger om dit in 2 verschillende queries op te halen.

Death smiles at us all, all a man can do is smile back.
PSN


Acties:
  • 0 Henk 'm!

  • IceM
  • Registratie: Juni 2003
  • Laatst online: 11-09 20:35
YakuzA schreef op woensdag 17 augustus 2011 @ 17:11:
Wat is de betekenis van 'status' ?

Is het de status van de gebruiker? > Waarom zijn dan meerdere statussen mogelijk?

zoals hierboven ook vermeld, als er geen relatie is tussen berichten en status, dan is het logischer/netter/handiger om dit in 2 verschillende queries op te halen.
Status is gewoon een voorbeeld (net als de overige 2 tabellen). Ik had beter voor relaties ofzo kunnen kiezen. Het leek mij in eerste instantie logisch om alle informatie over 1 object met 1 query op te halen maar heb het inmiddels opgesplitst.

...


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 12:47

Dido

heforshe

Algemene opmerking: je moet niet vergeten dat je in SQL records ophaalt, geen velden. Jij hebt dus in je voorbeeld helemaal geen dubbele resultaten, want je rijen zijn verschillend.

Als je redundante data terugkrijgt (zoals bij jou dus je statussen) dan is dat een aanwijzing dat je misschien gegevens aan het ophalen bent die niet bij elkaar horen, zoals in jouw voorbeeld dus bericht en status. Alle informatie in een rij of record hoort normaliter bij elkaar:
orderregelnummer, artikelnummer, artikelomschrijving, aantal, stuksprijs, totaalprijs

Jij gaat er nu iets anders bijhalen wat wel bij de orderregel hoort, maar niet bij al de rest van de eerder genoemde rij, bijvoorbeeld het ordernummer waar de regel bijhoort:
ordernummer, orderregelnummer, artikelnummer, artikelomschrijving, aantal, stuksprijs, totaalprijs

Je ordernummer zal nu uiteraard steeds herhaald worden, net als je status, dus kun je die beter apart ophalen.

Wat betekent mijn avatar?


  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Dido schreef op woensdag 17 augustus 2011 @ 19:56:
Je ordernummer zal nu uiteraard steeds herhaald worden, net als je status, dus kun je die beter apart ophalen.
Ik betwijfel of je het beter apart kunt ophalen: 2 queries uitvoeren om dubbele data te voorkomen kan langzamer zijn dan gewoon 1 query uitvoeren met dubbele data. Je moet gewoon bij het verwerken van de resultset weten welke gegevens er dubbel zijn en ze dan op de juiste manier verwerken.

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 10:01

Knutselsmurf

LED's make things better

Remus schreef op donderdag 18 augustus 2011 @ 11:45:
[...]

Ik betwijfel of je het beter apart kunt ophalen: 2 queries uitvoeren om dubbele data te voorkomen kan langzamer zijn dan gewoon 1 query uitvoeren met dubbele data. Je moet gewoon bij het verwerken van de resultset weten welke gegevens er dubbel zijn en ze dan op de juiste manier verwerken.
Ik weet wel bijna zeker dat het beter is om die twee sets gegevens die niets met elkaar te maken hebben apart op te halen. Als je het in 1 query doet, moet je vervolgens weer met code aan de gang om de gegevens te splitsen.
Liever 2 queries die bijvoorbeeld 15 berichten en 10 statussen teruggeven, dan 1 query die 150 combinaties teruggeeft, die vervolgens in je code moet gaan analyseren.
Ik ga er voor het gemak maar even van uit dat je de berichten en de statussen in aparte lijsten wilt tonen.

- This line is intentionally left blank -

Pagina: 1