Alle vrienden selecteren van die persoon

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Remco van Akker

Remco van Akker

01/04/2012 17:00:33
Quote Anchor link
Hallo iedereen,

Ik wil alle vrienden bijvoorbeeld van piet laten zien op
de profiel pagina maar ik weet niet hoe ik dat ga aanpakken.
Heeft iemand een idee hoe dit moet?
Het liefst wil ik wel de vrienden in een table doen.
Alvast bedankt!
 
PHP hulp

PHP hulp

21/12/2024 18:57:53
 
Joren de Wit

Joren de Wit

01/04/2012 17:04:00
Quote Anchor link
Wat heb je nu al? Als je met een database werkt, kun je dit eenvoudig doen. Een versimpeld voorbeeld van een datamodel

gebruikers
---------
id
naam

vrienden
--------
gebruiker_id
vriend_id (=> is ook een verwijzing naar gebruikers.id)

En vervolgens kun je met een eenvoudige SELECT query een gebruiker en al zijn vrienden ophalen.
 
Wouter J

Wouter J

01/04/2012 17:14:54
Quote Anchor link
Een tabel met alle gebruikers maken. Vervolgens een koppel tabel die deze gebruikers als vrienden aan elkaar koppelt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
+-------------+
|    Users    |
+----+--------+
| id |  naam  |
+----+--------+
|  1 | Wouter |
|  2 | Jan    |
|  3 | Piet   |
|  4 | Nico   |
|  5 | Pim    |
|  6 | Jelmer |
+----+--------+

+---------------------+
|   Vrienden_koppel   |
+---------+-----------+
| user_id | vriend_id |
+---------+-----------+
|    1    |     3     |
|    1    |     5     |
|    2    |     4     |
|    5    |     2     |
|    3    |     6     |
|    2    |     1     |
+---------+-----------+

Hierbij heeft User1 User3 en User5 als vriend, User2 User4 en User1, User5 User2 en User3 User6.

Doormiddel van JOINs kun je nu de vrienden ophalen: voorbeeld. En met subqueries is dit ook te doen: ]voorbeeld.
Gewijzigd op 01/04/2012 18:13:32 door Wouter J
 
Joren de Wit

Joren de Wit

01/04/2012 17:44:17
Quote Anchor link
@Wouter: over het algemeen zou je dan toch liever kiezen voor een JOIN? Aangezien dat in de meeste gevallen de efficiëntere oplossing is?
 
Wouter J

Wouter J

01/04/2012 17:49:07
Quote Anchor link
Ik ben niet zo heel erg ervaren in SQL en kon het met een JOIN niet voor elkaar krijgen en hiermee wel. Dit lijk me ook wel een handige oplossing, maar het zou vast wel beter kunnen. (ben wel benieuwd hoe je zoiets dan met een JOIN oplost)
Gewijzigd op 01/04/2012 17:49:27 door Wouter J
 
Joren de Wit

Joren de Wit

01/04/2012 17:57:29
Quote Anchor link
Bijvoorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
  vr.naam
FROM
  gebruikers AS vr
INNER JOIN
  vrienden AS v
    ON v.vriend_id = g.id
LEFT JOIN
  gebruikers AS g
    ON g.id = v.gebruiker_id
WHERE
  g.naam = 'Piet'

Dit is uit de losse pols maar waar het op neer komt is dat je vanaf de gebruikersnaam (Piet) naar zijn gebruikers id gaat. Van daaruit kom je via de koppeltabel vervolgens op de id's van de vrienden uit waar je vervolgens weer een naam uit de gebruikers tabel bij moet zoeken.

Het gebruik van aliassen (AS ...) is hierbij onmisbaar aangezien je de gebruikers tabel meerdere keren gebruikt.
 
Wouter J

Wouter J

01/04/2012 18:04:38
Quote Anchor link
Ziet er interessant uit, 2 joins in een query. Alleen als ik het probeer te testen krijg ik een undefined g.id error bij regel 7. voorbeeldje

Toevoeging op 01/04/2012 18:04:39:

Ziet er interessant uit, 2 joins in een query. Alleen als ik het probeer te testen krijg ik een undefined g.id error bij regel 7. voorbeeldje
 
Joren de Wit

Joren de Wit

01/04/2012 18:10:13
Quote Anchor link
Oh die g moet natuurlijk vr zijn. Ik maak de opmerking dat je goed moet kijken, maar zoals je ziet gaat het als snel fout als ik zoiets uit de losse pols opschrijf.

Maar goed, laten we verder niet dit topic kapen en de TS de ruimte geven om zijn vragen te stellen ;-)
 
- SanThe -

- SanThe -

01/04/2012 18:11:24
Quote Anchor link
Wouter J op 01/04/2012 17:14:54:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
+---------------------+
|   Vrienden_koppel   |
+---------+-----------+
| user_id | vriend_id |
+---------+-----------+
|    1    |     3     |
|    1    |     5     |
|    2    |     1     |
+---------+-----------+

Hierbij heeft User1 User3 en User5 als vriend


Ik zou denken dat User2 daar ook bij hoort.
Vriendschap komt niet van één kant neem ik aan.
 
Wouter J

Wouter J

01/04/2012 18:15:29
Quote Anchor link
Ik weet niet precies waarvoor het is, maar ik dacht aan iets als Google+ ofzo. Daar hoeft User1 niet per se vriend te zijn met User2, omdat User2 bevriend is met User1.
 
Erwin H

Erwin H

01/04/2012 19:39:48
Quote Anchor link
Persoonlijk heb ik het iets anders opgelost. Als je met zo'n koppel tabel werkt krijg je op den duur altijd problemen met de wederzijdse vriendschappen, zoals SanThe al aangeeft. In mijn applicatie is een vriendschap altijd wederzijds, dus als record 1-2 bestaat, dan is user 1 vriend van user 2 en andersom. Wil je geen wederzijdse vriendschappen, maar de situatie die Wouter aangeeft dan is onderstaand voorbeeld eenvoudig aan te passen.

Mijn vrienden koppel tabel ziet er eigenlijk zo uit:
user_id1
user_id2
status
request_date

Als eerste heb ik een view gebouwd waarin alle vriendschappen al zijn uitgewerkt. Dit bespaart je lange queries op het moment dat je later ook de vriendschappen wil gebruiken om gegevens wel of niet te tonen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE VIEW v_friends AS (
  SELECT user_id1 AS user_id, user_id2 AS friend_id, a.country_id AS user_country_id,
    b.username AS friend_username, status, user_id1 AS friend_requestor, request_date
  FROM user_friends
  INNER JOIN users a ON user_friends.user_id1 = a.user_id
  INNER JOIN users b ON user_friends.user_id2 = b.user_id
) UNION (
  SELECT user_id2 AS user_id, user_id1 AS friend_id, a.country_id AS user_country_id,
    b.username AS friend_username, status, user_id1 AS friend_requestor, request_date
  FROM user_friends
  INNER JOIN users a ON user_friends.user_id2 = a.user_id
  INNER JOIN users b ON user_friends.user_id1 = b.user_id
)

Dit is dus een union waarbij ik alle vriendschappen verdubbel naar twee recods in de view zodat een vriendschap die is opgeslagen als 1-2 naar zowel een 1-2 relatie als naar een 2-1 relatie. Het voordeel hiervan is dat als ik alle vrienden van 1 wil zien ik dit heel eenvoudig als volgt kan doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT friend_id, friend_username
FROM v_friends
WHERE user_id = 1


Let op dat het dus een view is en geen tabel. Dat wil zeggen dat er geen dubbele gegevens worden opgeslagen en het verdubbelen van de records dus alleen gebeurt wanneer het nodig is en alleen voor die records die zullen worden geselecteerd.
Gewijzigd op 01/04/2012 19:42:28 door Erwin H
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.