Estoy tratando de obtener todas las solicitudes de amistad pendientes de una tabla con esquema:
| identificación | id_usuario | amigo_id |
|---|
Una solicitud pendiente sería solo una fila como:
(Lo que significa que el usuario 1 envió una solicitud al usuario 2)
| identificación | id_usuario | amigo_id |
|---|---|---|
| 1 | 1 | 2 |
y cuando se acepta, se convierte en dos filas, y puedo unir dos de esta tabla para encontrar todas las aceptadas (esto funciona bien).
Una solicitud de referencia aceptada:
| identificación | id_usuario | amigo_id |
|---|---|---|
| 1 | 1 | 2 |
| 2 | 2 | 1 |
Mi consulta aceptada se ve así (estoy usando Bookshelf js y knex.js):
const friends = new Friends(); return friends.query((qb) => { qb.select('friends.user_id', 'friends.friend_id'); qb.join('friends as friendsTwo', 'friends.user_id', 'friendsTwo.friend_id'); qb.where('friends.user_id', '=', id); }).fetchAll();¿Cómo puedo modificar esto para obtener solo las relaciones unidireccionales? Lo primero que pensé fue unirme y no pude hacer que funcionara, así que si alguien sabe una respuesta o ha visto una buena respuesta, por favor guíeme, gracias :).
Creo que puedes alejarte por completo de la idea de unirte a este proyecto. Había hecho algo similar en mis proyectos anteriores y creo que será mejor agregar un tercer campo isMutual que significa si son mutuos o no. El campo se explica por sí mismo y creo que entendiste la idea. Después de eso, su mesa debe verse como
| identificación | id_usuario | amigo_id | esmutual |
|---|---|---|---|
| 1 | 1 | 2 | falso |
| identificación | id_usuario | amigo_id | esmutual |
|---|---|---|---|
| 1 | 2 | 1 | verdadero |
| 2 | 1 | 2 | verdadero |
Creo que hacer esto realmente beneficiará a su sistema ya que su consulta será más rápida e intentará crear un compound index for (user_id, friend_id) . Esta solución es más hacia cambiar la carga.
Con esto, puede lograr consultas más rápidas, pero todo el trabajo duro realizado durante la READ OPERATION en el esquema anterior cambiará a la WRITE OPERATION . Pero creo que esto reducirá más la velocidad de escritura. Y sí, asegúrese de usar la transacción para realizar actualizaciones para el campo isMutual .
qb.leftJoin('friends as friendsTwo', 'friends.user_id', 'friendsTwo.friend_id'); qb.whereNull('friendsTwo.user_id'); Esto LEFT JOIN , que mantiene todas las filas (pendientes o aceptadas), pero luego filtra para mantener solo aquellas que no tienen un registro coincidente en friendsTwo ; devolviendo así solo los enlaces pendientes.