[MySQL] Vrienden tabel

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 21-09 15:23
Volgens mij is de volgende vraag helemaal niet zo lastig, maar ik kom er even niet uit. Ik moet echt eens een goed boek over SQL kopen.....

Ik heb de volgende tabel:

Afbeeldingslocatie: http://cl.ly/E70G/tabel.png

Dit is een simpele "vrienden tabel" laten we zeggen dat ik de gebruiker met id 1 ben, ik heb dus één vriend namelijk de gebruiker met id 2 voelt iemand zich geroepen om gebruiker 2 te spelen? :+ .

Nu wil ik graag alle mensen uit deze tabel halen die geen vriend van mij zijn.

Alle vrienden van mij ophalen is vrij simpel.
SQL:
1
SELECT * FROM friends WHERE userId=1


Maar voor alle niet vrienden werkt dit natuurlijk niet:
SQL:
1
SELECT * FROM friends WHERE userId!=1


Omdat hij bij de rij '2-1' 2 inderdaad niet pakt, maar dan pakt hij hem alsnog mee bij de rijd '2-3'.

Weet iemand hoe ik dit probleem kan tacklen?

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Je kunt alle users selecteren uit de tabel users, en dan met WHERE NOT EXISTS kijken of die inderdaad geen vriend is.

[ Voor 4% gewijzigd door GlowMouse op 11-02-2012 20:16 ]


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 21-09 15:23
Dat zou misschien kunnen, maar dat lijkt mij niet de meest optimale route?

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 21-09 18:54
Stomme vraag; maar is dit een 1-weg systeem of 2 wegs?

Dus User 1 kan User 2 als vriend hebben, maar User 2 kan ook User 1 als vriend hebben?

Of is het echt zo dat als User 1 met 2 gekopeld is er verder niet gekoppeld kan worden.

Volgens mij moet de WHERE NOT EXISTS volstaan? Maar dat ligt er ook maar net aan hoe je je data benaderd en welke mogelijkheden er zijn qua koppelingen.

[ Voor 24% gewijzigd door RedHat op 11-02-2012 20:19 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

ZpAz schreef op zaterdag 11 februari 2012 @ 20:16:
Dat zou misschien kunnen, maar dat lijkt mij niet de meest optimale route?
Waarop baseer je die aanname?

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

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 21-09 15:23
RedHat schreef op zaterdag 11 februari 2012 @ 20:17:
Stomme vraag; maar is dit een 1-weg systeem of 2 wegs?

Dus User 1 kan User 2 als vriend hebben, maar User 2 kan ook User 1 als vriend hebben?

Of is het echt zo dat als User 1 met 2 gekopeld is er verder niet gekoppeld kan worden.
In dit voorbeeld 1 weg, maar in mijn uiteindelijke code zou het ook de andere kant op zijn, maar ik dacht ik probeer de case zo simpel mogelijk te houden.
NMe schreef op zaterdag 11 februari 2012 @ 20:17:
[...]

Waarop baseer je die aanname?
Omdat je dan eerst alle mensen die geen vriend zijn ook ophaalt om ze later weg te gooien? Maar bij nader inzien is dat op zich niet zo erg omdat eerst de gebruikers worden gefilterd op basis van e-mail adres, dus je zo en zo al veel mensen niet op hoeft te halen.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

ZpAz schreef op zaterdag 11 februari 2012 @ 20:20:
[...]

Omdat je dan eerst alle mensen die geen vriend zijn ook ophaalt om ze later weg te gooien?
Hoe dacht je dat andere filtermethodes werken? ;)

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

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 21-09 15:23
Nja, ik bedoel meer dat als je een lijstje samenstelt van bovenstaande tabel waar alleen 'x' userId's in zitten en je koppelt dan de gebruikers-tabel er aan dat dit sneller zou werken dan andersom. Omdat je dan eerst matcht en dan pas de gebruikers-tabel er bij betrekt ipv eerst alle gebruikers ophalen en die per stuk gaan matchen.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • Melodic Metal
  • Registratie: November 2009
  • Laatst online: 22-09 10:30
Ik denk dat je in deze richting moet zoeken:
SQL:
1
SELECT * FROM friends WHERE userId not in (SELECT userId FROM friends WHERE userId=1)

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 21-09 15:23
GlowMouse schreef op zaterdag 11 februari 2012 @ 20:15:
Je kunt alle users selecteren uit de tabel users, en dan met WHERE NOT EXISTS kijken of die inderdaad geen vriend is.
Opgelost met not exists. Thanks.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Melodic Metal schreef op zaterdag 11 februari 2012 @ 20:36:
Ik denk dat je in deze richting moet zoeken:
SQL:
1
SELECT * FROM friends WHERE userId not in (SELECT userId FROM friends WHERE userId=1)
Deze oplossing is inferieur in MySQL, zoek het verschil maar op tussen NOT IN en WHERE NOT EXISTS.
Pagina: 1