hallo iedereen,
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.
Dat bedoel ik ook ongeveer maar dan wil ik zeg maar
Dan wil ik de persoon met het meeste gemeenschappelijke vrienden bovenaan
Hoe sla je het op?
Heb je per 'koppel' 2 records of 1?
Per koppel 1 die word zo opgeslagen
-id van het record
-user_id verstuurder van het verzoek
-friend_id ontvanger van het verzoek
-status status van het verzoek (vrienden of verzoek)
Extreme self-join:

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  

[edit]Query een beetje aangepast[/edit]
hartelijk bedankt voor de code!
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
Niet helemaal goed ben ik bang, vrienden die reeds jouw vriend zijn worden in de eerdere query ook getoond.
Deze zal beter gaan:

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

Reageren