Lista amici dell'utente 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';
L'utente 123 è un fan di questi utenti:
SELECT u.* FROM users u INNER JOIN friend_requests f ON f.user_id = u.id WHERE f.friend_id = 123 AND status = 'waiting';
Non dimenticare di aggiungere l'indice nella colonna di stato.
Inoltre, non sono sicuro che un tavolo come questo sia l'ideale per questo.
MODIFICA:
Probabilmente sceglierei uno schema come questo:
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)
Quando qualcuno fa una richiesta di amicizia, aggiungi una nuova riga alla tabella friend_request. Quando il destinatario della richiesta sceglie di:
- per accettare la richiesta:aggiungi nuova riga a friend_xref e imposta risolto a 1 nella tabella friend_request
- per negare la richiesta:aggiungi una nuova riga a fan_xref e imposta risolto a 1 nella tabella friend_request
Ma sarebbe meglio chiedere questo sotto mysql, database-design o qualche tag simile per ottenere le migliori risposte.