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
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)
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
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