¿Sistema amigo en PHP / MySQL?

Estoy tratando de escribir un sistema de amigos que funcione así:

  1. El usuario A envía una solicitud de amistad al usuario B.
  2. El usuario B acepta la solicitud de amistad del usuario A.
  3. Los usuarios A y B ahora son amigos.

Aquí está la estructura de mi base de datos:

CREAR TABLA SI NO EXISTE `users` (` id` int (11) NOT NULL AUTO_INCREMENT, `username` varchar (16) NOT NULL,` password` char (32) NOT NULL, `email` varchar (80) NOT NULL, `dname` varchar (24) NOT NULL,` profile_img` varchar (255) NOT NULL DEFAULT '/images/default_user.png', `created` int (11) NOT NULL,` updated` int (11) NOT NULL, PRIMARY CLAVE (`id`), CLAVE ÚNICA` email` (`email`), CLAVE ÚNICA` username` (`username`)) ENGINE = InnoDB DEFAULT CHARSET = latin1 AUTO_INCREMENT = 8;
CREAR TABLA SI NO EXISTE `friend_requests` (` id` int (11) NOT NULL AUTO_INCREMENT, `user_a` int (11) NOT NULL DEFAULT '0',` user_b` int (11) NOT NULL DEFAULT '0', `visualizado `tinyint (1) NOT NULL DEFAULT '0', PRIMARY KEY (` id`)) ENGINE = InnoDB DEFAULT CHARSET = latin1 AUTO_INCREMENT = 8;
CREAR TABLA SI NO EXISTE `friends` (` id` int (11) NOT NULL AUTO_INCREMENT, `user_a` int (11) NOT NULL DEFAULT '0',` user_b` int (11) NOT NULL DEFAULT '0', `friend_type `int (3) NOT NULL DEFAULT '1',` friends_since` int (11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`)) ENGINE = InnoDB DEFAULT CHARSET = latin1 AUTO_INCREMENT = 1;

Puedo enumerar los amigos de un usuario con "SELECT * FROM friends WHERE user_a = $ userid OR user_b = $ userID", pero ¿cómo puedo obtener datos como username or profile_img from the users ¿mesa?

preguntado el 16 de noviembre de 11 a las 08:11

Tienes que hacer otro SELECT declaración o una INNER JOIN. -

3 Respuestas

Creo que has sobrepasado (!) Tu problema un poco.

Podrías tener solo un Usermesa y un Friendshipmesa. Tu mesa de la amistad podría contener UserID int, FriendID int, Created_at datetime, Confirmed_at datetime.

select * from User
  left outer join Friendship on User.ID = Friendship.UserID
  left outer join User as Friend on Friendship.FriendID = Friend.ID
  where User.ID = <some users ID>

Editar: es posible que lo haya superado yo mismo la primera vez;)

select * from Friendship
  inner join User on Friendship.FriendID = User.ID
  where Friendship.UserID = <some users ID>

Esto haría que los usuarios fueran amigos ... (sintaxis MSSQL)

Oh, lo olvidé. Cuándo Confirmed_at is null la solicitud de amistad aún no está confirmada.

respondido 16 nov., 11:12

SELECT DISTINCT
a.username,
a.profile_img
FROM
users a
WHERE
a.id in (SELECT user_a FROM friends WHERE user_a = $userid OR user_b = $userID)
and a.id <> $userid

UNION

SELECT
b.username,
b.profile_img
FROM
users b
WHERE
b.id in (SELECT user_b FROM friends WHERE user_a = $userid OR user_b = $userID)
and b.id <> $userid

respondido 16 nov., 11:18

Puedes administrarlo usando PHP. Al recorrerlo, verifique id y si es igual a $ userID, vaya al siguiente resultado. O lea mi edición en la respuesta anterior aquí, las últimas dos líneas en cada bloque SQL (y a.id <> $ userID) (y b.id <> $ userID) - Hamikzo

Sigo pensando que la estructura de la base de datos está mal diseñada. Tienes redundancia en las amistades cuando usas tanto una mesa de solicitud de amistad como una mesa de amistad. En mi opinión, una solicitud de amistad es una amistad sin "aprobación". - Christian Wattengard

Deberá utilizar combinaciones para unir los amigos de la mesa a los usuarios. P.ej:

  SELECT * FROM friends as f INNER JOIN users AS u ON u.id = f.user_a WHERE user_a = $userid

respondido 16 nov., 11:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.