vrienden van vrienden systeem
ik wil graag dat als iemand (persoon A) op iemands account (persoon B) kijkt dat er dan max 8 aangeraden vrienden van die persoon staan. ik wil die vrienden selecteren op basis van gemeenschappelijke vrienden maar hoe kan ik die personen selecteren? de tabel met vrienden bestaat uit:
-id
-user_id
-friend_id
-status
weet iemand hoe ik dit het beste kan aanpakken?
alvast bedankt
Christian k op 01/07/2014 15:43:33:
ik wil die vrienden selecteren op basis van gemeenschappelijke vrienden
dat snap ik niet.
Wat wel kan:
Persoon A is bevriend met Persoon B.
Persoon B heeft een vriend Persoon C.
Stel Persoon C voor als vriend aan Persoon A.
Dan wil ik de persoon met het meeste gemeenschappelijke vrienden bovenaan
Ik heb daar niet zo even iets voor liggen.
Heb je per 'koppel' 2 records of 1?
-id van het record
-user_id verstuurder van het verzoek
-friend_id ontvanger van het verzoek
-status status van het verzoek (vrienden of verzoek)
Code (php)
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
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
SELECT
fr.friend_id,
u.user_name,
COUNT(ff.user_id) common_friends
FROM (
SELECT
CASE
WHEN user_id = 2 THEN friend_id
ELSE user_id
END friend_id
FROM
friends f
WHERE
(user_id = 2 AND friend_id <> 1)
OR
(friend_id = 2 AND user_id <> 1)
) fr
JOIN
friends fof
ON
fr.friend_id = fof.friend_id
OR
fr.friend_id = fof.user_id
LEFT JOIN
friends ff
ON
(IF(fr.friend_id = fof.friend_id, fof.user_id, fof.friend_id) = ff.friend_id AND ff.user_id = 1)
OR
(IF(fr.friend_id = fof.friend_id, fof.user_id, fof.friend_id) = ff.user_id AND ff.friend_id = 1)
JOIN
users u
ON
fr.friend_id = u.user_id
GROUP BY
fr.friend_id, u.user_name
ORDER BY
common_friends DESC
LIMIT 8
fr.friend_id,
u.user_name,
COUNT(ff.user_id) common_friends
FROM (
SELECT
CASE
WHEN user_id = 2 THEN friend_id
ELSE user_id
END friend_id
FROM
friends f
WHERE
(user_id = 2 AND friend_id <> 1)
OR
(friend_id = 2 AND user_id <> 1)
) fr
JOIN
friends fof
ON
fr.friend_id = fof.friend_id
OR
fr.friend_id = fof.user_id
LEFT JOIN
friends ff
ON
(IF(fr.friend_id = fof.friend_id, fof.user_id, fof.friend_id) = ff.friend_id AND ff.user_id = 1)
OR
(IF(fr.friend_id = fof.friend_id, fof.user_id, fof.friend_id) = ff.user_id AND ff.friend_id = 1)
JOIN
users u
ON
fr.friend_id = u.user_id
GROUP BY
fr.friend_id, u.user_name
ORDER BY
common_friends DESC
LIMIT 8
Edit:
Query een beetje aangepast
Gewijzigd op 03/07/2014 10:07:33 door Ger van Steenderen
maar op welke plekken moet ik de $user_id van de user van wie het account is plaatsen
en waar de $myid het id van mij?
Waar in de query 1 staat ben jijzelf, en 2 is het account van de user.
hij werkt hartelijk bedankt
Deze zal beter gaan:
Code (php)
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
SELECT
fr.friend_id,
u.user_name,
COUNT(ff.user_id) common_friends
FROM (
SELECT f.friend_id FROM
(SELECT
CASE
WHEN user_id = 2 THEN friend_id
ELSE user_id
END friend_id
FROM
friends f
WHERE
(user_id = 2 AND friend_id <> 1)
OR
(friend_id = 2 AND user_id <> 1)
) f
LEFT JOIN
friends k
ON
(f.friend_id = k.friend_id AND k.user_id = 1)
OR
(f.friend_id = k.user_id AND k.friend_id = 1)
WHERE k.user_id IS NULL
) fr
JOIN
friends fof
ON
fr.friend_id = fof.friend_id
OR
fr.friend_id = fof.user_id
LEFT JOIN
friends ff
ON
(IF(fr.friend_id = fof.friend_id, fof.user_id, fof.friend_id) = ff.friend_id AND ff.user_id = 1)
OR
(IF(fr.friend_id = fof.friend_id, fof.user_id, fof.friend_id) = ff.user_id AND ff.friend_id = 1)
JOIN
users u
ON
fr.friend_id = u.user_id
GROUP BY
fr.friend_id, u.user_name
ORDER BY
common_friends DESC
LIMIT 8
fr.friend_id,
u.user_name,
COUNT(ff.user_id) common_friends
FROM (
SELECT f.friend_id FROM
(SELECT
CASE
WHEN user_id = 2 THEN friend_id
ELSE user_id
END friend_id
FROM
friends f
WHERE
(user_id = 2 AND friend_id <> 1)
OR
(friend_id = 2 AND user_id <> 1)
) f
LEFT JOIN
friends k
ON
(f.friend_id = k.friend_id AND k.user_id = 1)
OR
(f.friend_id = k.user_id AND k.friend_id = 1)
WHERE k.user_id IS NULL
) fr
JOIN
friends fof
ON
fr.friend_id = fof.friend_id
OR
fr.friend_id = fof.user_id
LEFT JOIN
friends ff
ON
(IF(fr.friend_id = fof.friend_id, fof.user_id, fof.friend_id) = ff.friend_id AND ff.user_id = 1)
OR
(IF(fr.friend_id = fof.friend_id, fof.user_id, fof.friend_id) = ff.user_id AND ff.friend_id = 1)
JOIN
users u
ON
fr.friend_id = u.user_id
GROUP BY
fr.friend_id, u.user_name
ORDER BY
common_friends DESC
LIMIT 8