[PHP+MySQL] Adressenlijst koppelen aan gebruikers

Pagina: 1
Acties:

  • arieleks
  • Registratie: September 2002
  • Laatst online: 13-08-2013
Ik zit met een probleempje, en ondanks excessief ge-google kom ik er vooralsnog niet uit. Het bekende bomen-bos-syndroom, ben ik bang.

Ik wil gebruikers in staat stellen om een adreslijst op te slaan, waar ik dan stickers mee kan printen. Tot zover geen enkel probleem.

Ik heb drie tabellen:

gebruikers
id
gebruikersnaam
enz.

adreslijst (alle ingevulde adressen)
id
naam
adres
enz.

adreslijst_link (koppelt gebruikers aan ingevulde adressen)
adres_id
gebruikers_id

Nu is het grootste probleem dat twee gebruikers hetzelfde adres invullen. En ik wil per adres maar 1 sticker uitdraaien, met daarop de groeten van de gebruikers die dat adres hebben ingevuld.

Ik wil dus, het liefst met 1 query, alle adressen krijgen, met per adres de gebruiker(s) die dat adres heeft/hebben ingevuld. Is zoiets mogelijk?

- Rietberg - sieben Mal sympatisch -

There are only 10 types of people, those who make stupid jokes about binary numbers and those who don't.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Ja, dat kan gewoon. Je bent, gezien je tabelstructuur, bekend met joins. Die kun je hiervoor toch ook gewoon gebruiken? :)

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


Verwijderd

Ik denk dat het sleutelwoord `distinct` op dit moment je vriend is. Even zoeken daarop doet wonderen.

  • arieleks
  • Registratie: September 2002
  • Laatst online: 13-08-2013
-NMe- schreef op maandag 09 januari 2006 @ 18:01:
Ja, dat kan gewoon. Je bent, gezien je tabelstructuur, bekend met joins. Die kun je hiervoor toch ook gewoon gebruiken? :)
JOINs zijn op dit moment even niet mijn vriend, DISTINCT ook niet... ;)

Stel 3 gebruikers hebben eenzelfde adres ingevuld. Dan staat er ergens in tabel adreslijst_link zoiets als dit.

gebruikers idadres id
11
21
31


Hoe krijg ik mijn JOIN dan zover om zoiets als dit te geven:

adres idadresgebruikers
1Blastraat 23Jan,Piet,Klaas


Ik krijg een donkerbruin gevoel dat dit niet kan, klopt dat? Hoopte het te kunnen doen zonder weer een van mijn vunzige PHP-workarounds te hoeven gebruiken... :Y)

Edit:
Ok, na alle mogelijke join combi's te hebben uitgeprobeerd ;) kom ik niet verder dan wat ik eigenlijk al vanaf het begin had gevonden:

adres idadresgebruiker
1Blastraat 23Jan
1Blastraat 23Piet
1Blastraat 23Klaas

[ Voor 27% gewijzigd door arieleks op 09-01-2006 19:02 ]

- Rietberg - sieben Mal sympatisch -

There are only 10 types of people, those who make stupid jokes about binary numbers and those who don't.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Ja, dat is toch precies wat je hebben moet? Uiteindelijk ga je dan in je applicatielaag de weergave regelen en dubbele gegevens eruit filteren.

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


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:29
SELECT
*
FROM users AS u
INNER JOIN linktabel AS l ON u.uid=l.userid
INNER JOIN adressen AS a ON a.uid=l.adresid
WHERE u.id=JE USER ID

Zoiets?

Overigens zou ik de tabel users weglaten omdat je daar weinig andere informatie in hebt zitten in vergelijking tot je adressen tabel. Ik zou dus gewoon een kolom username en wachtwoord aan je adressentabel toevoegen.

[ Voor 53% gewijzigd door djluc op 09-01-2006 19:15 ]


  • arieleks
  • Registratie: September 2002
  • Laatst online: 13-08-2013
djluc schreef op maandag 09 januari 2006 @ 19:13:
SELECT
*
FROM users AS u
INNER JOIN linktabel AS l ON u.uid=l.userid
INNER JOIN adressen AS a ON a.uid=l.adresid
WHERE u.id=JE USER ID

Zoiets?
Die van mij ziet er ietsjes anders uit, maar doet hetzelfde.
Overigens zou ik de tabel users weglaten omdat je daar weinig andere informatie in hebt zitten in vergelijking tot je adressen tabel. Ik zou dus gewoon een kolom username en wachtwoord aan je adressentabel toevoegen.
Helaas geen optie. Er staat een hoop meer info in de gebruikerstabel, had ik alleen even weggelaten.
-NMe- schreef op maandag 09 januari 2006 @ 19:10:
Ja, dat is toch precies wat je hebben moet? Uiteindelijk ga je dan in je applicatielaag de weergave regelen en dubbele gegevens eruit filteren.
Tsja, daar ben ik ook bang voor. Helaas.
Maar toch nuttig om even te kijken of wat ik wilde uberhaupt wel mogelijk was op de simpele manier...


En wat de een 'weergave regelen in applicatielaag' noemt, noemt de ander 'vunzigheden in PHP' ;)

- Rietberg - sieben Mal sympatisch -

There are only 10 types of people, those who make stupid jokes about binary numbers and those who don't.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

arieleks schreef op maandag 09 januari 2006 @ 19:29:
Maar toch nuttig om even te kijken of wat ik wilde uberhaupt wel mogelijk was op de simpele manier...
Oh, misschien is het wel mogelijk hoor, maar de vraag is dan of het efficiënter zou zijn dan wanneer je het in PHP doet. Je zou dan, als het mogelijk is, namelijk zelf strings moeten gaan concateneren, eventueel in een subquery, en dat zou ook redelijk veeleisend zijn, en een hele lelijke query opleveren.
En wat de een 'weergave regelen in applicatielaag' noemt, noemt de ander 'vunzigheden in PHP' ;)
offtopic:
Eufemismen houden PHP-coders happy. :+

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


  • arieleks
  • Registratie: September 2002
  • Laatst online: 13-08-2013
-NMe- schreef op maandag 09 januari 2006 @ 19:40:
[...]

Oh, misschien is het wel mogelijk hoor, maar de vraag is dan of het efficiënter zou zijn dan wanneer je het in PHP doet. Je zou dan, als het mogelijk is, namelijk zelf strings moeten gaan concateneren, eventueel in een subquery, en dat zou ook redelijk veeleisend zijn, en een hele lelijke query opleveren.

[...]

offtopic:
Eufemismen houden PHP-coders happy. :+
Nou, het is gelukt hoor. :)

Thanks.

offtopic:
Ach, vergeleken met Java is alles smerig. Hoewel het wel een verademing is om in PHP te mogen vunzen als je een hele dag old school VB6 hebt zitten proggen... ;)

[ Voor 1% gewijzigd door arieleks op 09-01-2006 22:40 . Reden: Typo ]

- Rietberg - sieben Mal sympatisch -

There are only 10 types of people, those who make stupid jokes about binary numbers and those who don't.


  • imp4ct
  • Registratie: November 2003
  • Laatst online: 13:30
En waarom kan je niet gewoon in je adresselijst een itempje bijzetten "gebruikers_id", allé ik weet niet je gaat 3 tabellen gebruiken waar je er eigenlijk perfect 2 voor kunt gebruiken.

En oki, met JOINS en DESTINCT kan je ook perfect werken, maar dat is hier al aangehaald. 'k Zie niet echt in wat het grote probleem is eigenlijk.

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Distinct is hier in zijn geheel niet relevant. Distinct filtert dubbele records uit, niet dubbele velden. Daarnaast kloppen die tabellen zo prima: één gebruiker kan meerdere adressen hebben ingevoerd, en een ingevoerd adres kan bekend zijn bij meerdere gebruikers. Ergo, een many to many relatie, en daarom is een koppeltabel nodig. Lees er de normalisatieregels maar eens op na. :)

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


  • corani
  • Registratie: December 2000
  • Laatst online: 05-10-2017

corani

__,,,_(^_^)_,,,__

Misschien dat je een tijdelijke tabel kunt aanmaken... maar ja, ook niet echt fraai

Laat me nou toch eens met rust man!
Iedereen die in telekinese gelooft, steek a.u.b. mijn hand op


Verwijderd

-NMe- schreef op maandag 09 januari 2006 @ 23:30:
Distinct filtert dubbele records uit, niet dubbele velden.
Geheel offtopic;
Ik ben van mening dat het gebruik van distinct wel degelijk toe te passen is op een veld en niet louter op een record zoals jij vermeld.

  • Gurbe de n00b
  • Registratie: Juni 2003
  • Laatst online: 08-02-2024
Crossjoin denk ik;
Zie hier voor een uitleg.

Portfolio


  • arieleks
  • Registratie: September 2002
  • Laatst online: 13-08-2013
imp4ct schreef op maandag 09 januari 2006 @ 23:27:
En waarom kan je niet gewoon in je adresselijst een itempje bijzetten "gebruikers_id", allé ik weet niet je gaat 3 tabellen gebruiken waar je er eigenlijk perfect 2 voor kunt gebruiken.

En oki, met JOINS en DESTINCT kan je ook perfect werken, maar dat is hier al aangehaald. 'k Zie niet echt in wat het grote probleem is eigenlijk.
Zoals NMe al aangaf, heb ik die derde tabel echt nodig, vanwege het feit dat 1 adres gekoppeld kan zijn aan meerdere gebruikers.

Het 'grote' probleem was dat ik het liefst met alleen een query de data uit het systeem kan krijgen zoals ik dat wil. En helaas gaat niet altijd alles zoals ik wil... ;)

Ik heb nu gewoon even een PHP class gemaakt, waar de data uit de JOIN query in wordt gepropt, en vervolgens poept 'ie de data uit zoals ik dat wil. Als het werkt, dan werkt het. :)

- Rietberg - sieben Mal sympatisch -

There are only 10 types of people, those who make stupid jokes about binary numbers and those who don't.


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19

BikkelZ

CMD+Z

Kun je geen GROUP_CONCAT gebruiken?

iOS developer


Verwijderd

Waarom worden die gebruikers aan dezelfde adres_id gekoppeld? Is mi alleen onhandig in het gebruik. Krijg je dat je je adres uit een picklistje moet kiezen enzo...
Is het niet mogelijk om hetzelfde adres met verschillende id's op te nemen?

Anyway... als je toch de ingeslagen weg wilt volgen, is het erg lastig om dit in 1 sql statement te doen.
Je zal eigenlijk iets als pl/sql moeten gebruiken om dit makkelijk voor elkaar te krijgen.

Het kan wel, maar dat wordt denk ik erg lastig voor een niet doorgewinterde sql-er.
Je weet nl niet hoeveel mensen er op hetzelfde adres wonen dus zal je een offset-table moeten gaan werken. De eerste keer dat ik dat gebruikt zag worden ging ik eerst maar es koffie halen.

veel succes.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Verwijderd schreef op dinsdag 10 januari 2006 @ 08:30:
Geheel offtopic;
Ik ben van mening dat het gebruik van distinct wel degelijk toe te passen is op een veld en niet louter op een record zoals jij vermeld.
Wat je van mening bent is niet relevant voor het gedrag van SQL. Wanneer je distinct gebruikt in je query doet dat alleen wat als je dubbele records terugkrijgt in je recordset. Wanneer de eerste twee velden hetzelfde zijn, maar het laatste veld verschilt, dan heb je niets aan distinct omdat de records simpelweg verschillen. :P

Je zou hooguit gekke dingen kunnen proberen met subqueries, maar het leuke van MySQL is dat dat vaak nog niet werkt. :P

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

Pagina: 1