Lista znajomych użytkownika 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';
Użytkownik 123 jest fanem tych użytkowników:
SELECT u.* FROM users u INNER JOIN friend_requests f ON f.user_id = u.id WHERE f.friend_id = 123 AND status = 'waiting';
Nie zapomnij dodać indeksu w kolumnie stanu.
Ponadto nie jestem pewien, czy taki stół jest do tego idealny.
EDYCJA:
Prawdopodobnie wybrałbym taki schemat:
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)
Kiedy ktoś wysyła zaproszenie do znajomych, dodaj nowy wiersz do tabeli friend_request. Gdy odbiorca żądania postanowi:
- aby zaakceptować żądanie:dodaj nowy wiersz do friend_xref i ustaw rozstrzygnięty na 1 w tabeli friend_request
- aby odrzucić żądanie:dodaj nowy wiersz do fan_xref i ustaw rozwiązane na 1 w tabeli friend_request
Ale lepiej byłoby zapytać o to pod mysql, projektowaniem bazy danych lub podobnym tagiem, aby uzyskać najlepsze odpowiedzi.