Lista de amigos del usuario 123:
SELECT u.* FROM users u INNER JOIN friend_requests f ON f.user_id = u.id WHERE f.user_id = 123 AND status = 'accepted';
El usuario 123 es fan de estos usuarios:
SELECT u.* FROM users u INNER JOIN friend_requests f ON f.user_id = u.id WHERE f.friend_id = 123 AND status = 'waiting';
No olvide agregar el índice en la columna de estado.
Además, no estoy seguro de que una mesa como esta sea ideal para esto.
EDITAR:
Probablemente elegiría un esquema como este:
friend_request
request_from (foreign key to users.user_id)
request_to (foreign key to users.user_id)
resolved (boolean 1 or 0, default is 0)
friend_xref
friend (foreign key to users.user_id)
is_friend_with (foreign key to users_user_id)
fan_xref
user (foreign key to users.user_id)
is_fan_of (foreign key to users.user_id)
Cuando alguien hace una solicitud de amistad, agregue una nueva fila a la tabla friend_request. Cuando el destinatario de la solicitud elige:
- para aceptar la solicitud:agregue una nueva fila a friend_xref y establezca resuelto en 1 en la tabla friend_request
- para denegar la solicitud:agregue una nueva fila a fan_xref y establezca resuelto en 1 en la tabla friend_request
Pero sería mejor preguntar esto bajo mysql, diseño de base de datos o alguna etiqueta similar para obtener las mejores respuestas.