Pregunta:
Fecha: 12-11-2021 15:24:43
(En Español)
Espero que estén bien
Estoy desarrollando una relación de amistad en MySQL donde la relación de amistad es mutua. Si A es amigo le envía la invitación a B, y B acepta la amistad.
Le mostrare las tablas y la explicación de las mismas, luego plantearé el problema.
Tabla: Wo_Users (Todos los usuarios registrados)
user_id, username, first_name, last_name
1, 'founder', 'Walter', 'Sánchez'
2 'roberto_beruschi', 'Roberto', 'Bersuschi'
3, 'kapryar', 'kapry', 'ar'
4, 'cremin.nikita_905', 'Markus', 'Denesik'
5, 'mdickinson_115', 'Mozell', 'Ortiz'
6, 'kirstin07_638', 'Esther', 'White'
7, 'russ70_424', 'Ayla', 'Labadie'
8, 'carmen30_677', 'Magnolia', 'Fay'
9, 'berge.colin_657', 'Nadia', 'Gomez'
10, 'zborer_228', 'Abby', 'Waelchi'
11, 'shoeger_459', 'Emmanuelle', 'Schoen'
12, 'elijah.grant_674', 'Rollin', 'Lowe'
13, 'dorian.jacobi_982', 'Octavia', 'Schmidt'
Tabla: Wo_Followers
Contiene las relaciones de amistad, las que son amigos y las que aun no se ha aceptado la amistad, si el valor del campo active, es 0 es porque la solicitud no ha sido aceptada por lo tanto no son amigos, con valor 1 son amigos
id, follower_id, following_id, active
1, 2, 1, 1
2, 1, 2, 1
5, 2, 3, 1
6, 3, 2, 1
7, 2, 9, 1
8, 9, 2, 1
9, 2, 12, 1
10, 2, 7, 0
following_id: es id del usuario que envió la solicitud de amistad (el seguidor)
follower_id: es el id del usuario a quien se le envió la solicitud de amistad (el seguido)
active: con valor 1 son amigos, con valor 0 no son amigos aun.
Las query que necesito son las siguientes:
Las query que necesito son las siguientes:[/b][/u]
1) Necesito listar a todos los usuarios de la tabla Wo_Followers, a quien tiene como amigo. Amistad Aceptada, campo active=1
2) Necesito saber de cada usuario a quien le envió la solicitud y aun no fue aceptada (por medio del campo active =0)
3) Necesito saber de un usuario en particular, por ejemplo username= ''roberto_beruschi', que amigos tiene, solicitud aceptada, campo active =1
4) Necesito saber de un usuario en particular, por ejemplo username= ''roberto_beruschi', a que a usuario le envió la solicitud y no fue aceptada, campo active =0
Los listados, de cada query, debe mostrarse: user_id, username, first_name, last_name
He comenzado con el punto 1.
1) Necesito listar a todos los usuarios de la tabla Wo_Followers, a quien tiene como amigo. Amistad Aceptada, campo active=1
Hice la query
Pero me da mal el resultado
user_id, Usuario, following_id, AmigoDe
1, founder, 1, founder
2, roberto_beruschi, 2, roberto_beruschi
6, roberto_beruschi, 2, kirstin07_638
8, roberto_beruschi, 2, carmen30_677
5, kapryar, 3, mdickinson_115
10, russ70_424, 7, zborer_228
7, berge.colin_657, 9, russ70_424
9, elijah.grant_674, 12, berge.colin_657
Por ejemplo user_id =2, que es roberto_beruschi, es amigo a si mismo, como el usuario founder
y hay usuarios que no son amigos
Lo correcto seria por ejemplo, user_id =2, que es roberto_beruschi, es amigo de:
id, follower_id, following_id, active
1, 2, 1, 1
5, 2, 3, 1
7, 2, 9, 1
9, 2, 12, 1
En otras palabras
user_id, username, first_name, last_name
1, founder, Walter, Sánchez
3, kapryar, kapry, ar
9, berge.colin_657, Nadia, Gomez
12, elijah.grant_674, Rollin, Lowe
Agradezco la gentileza a quienes me ayuden a resolver cada uno de los puntos que he mencionado.
Aguardo respuestas.
Que tengan un excelente día.
Que tengan éxitos en sus proyectos
Saludos Votos: 1 - Respuestas: 7 - Vistas: 11 Compartir en: Google Facebook Twitter LinkedIn Link
Relaciones de amigos en MySQL como unir 2 tablas para saber su amigos, cantidad de amigos, etc?[Resuelta]
Hola a todos.Espero que estén bien
Estoy desarrollando una relación de amistad en MySQL donde la relación de amistad es mutua. Si A es amigo le envía la invitación a B, y B acepta la amistad.
Le mostrare las tablas y la explicación de las mismas, luego plantearé el problema.
Tabla: Wo_Users (Todos los usuarios registrados)
user_id, username, first_name, last_name
1, 'founder', 'Walter', 'Sánchez'
2 'roberto_beruschi', 'Roberto', 'Bersuschi'
3, 'kapryar', 'kapry', 'ar'
4, 'cremin.nikita_905', 'Markus', 'Denesik'
5, 'mdickinson_115', 'Mozell', 'Ortiz'
6, 'kirstin07_638', 'Esther', 'White'
7, 'russ70_424', 'Ayla', 'Labadie'
8, 'carmen30_677', 'Magnolia', 'Fay'
9, 'berge.colin_657', 'Nadia', 'Gomez'
10, 'zborer_228', 'Abby', 'Waelchi'
11, 'shoeger_459', 'Emmanuelle', 'Schoen'
12, 'elijah.grant_674', 'Rollin', 'Lowe'
13, 'dorian.jacobi_982', 'Octavia', 'Schmidt'
Tabla: Wo_Followers
Contiene las relaciones de amistad, las que son amigos y las que aun no se ha aceptado la amistad, si el valor del campo active, es 0 es porque la solicitud no ha sido aceptada por lo tanto no son amigos, con valor 1 son amigos
id, follower_id, following_id, active
1, 2, 1, 1
2, 1, 2, 1
5, 2, 3, 1
6, 3, 2, 1
7, 2, 9, 1
8, 9, 2, 1
9, 2, 12, 1
10, 2, 7, 0
following_id: es id del usuario que envió la solicitud de amistad (el seguidor)
follower_id: es el id del usuario a quien se le envió la solicitud de amistad (el seguido)
active: con valor 1 son amigos, con valor 0 no son amigos aun.
Las query que necesito son las siguientes:
Las query que necesito son las siguientes:[/b][/u]
1) Necesito listar a todos los usuarios de la tabla Wo_Followers, a quien tiene como amigo. Amistad Aceptada, campo active=1
2) Necesito saber de cada usuario a quien le envió la solicitud y aun no fue aceptada (por medio del campo active =0)
3) Necesito saber de un usuario en particular, por ejemplo username= ''roberto_beruschi', que amigos tiene, solicitud aceptada, campo active =1
4) Necesito saber de un usuario en particular, por ejemplo username= ''roberto_beruschi', a que a usuario le envió la solicitud y no fue aceptada, campo active =0
Los listados, de cada query, debe mostrarse: user_id, username, first_name, last_name
He comenzado con el punto 1.
1) Necesito listar a todos los usuarios de la tabla Wo_Followers, a quien tiene como amigo. Amistad Aceptada, campo active=1
Hice la query
SELECT A.user_id, C.username AS Usuario, B.following_id, A.username AS AmigoDe FROM Wo_Users A INNER JOIN Wo_Followers B ON A.user_id = B.id INNER JOIN Wo_Users C ON B.following_id = C.user_id;
Pero me da mal el resultado
user_id, Usuario, following_id, AmigoDe
1, founder, 1, founder
2, roberto_beruschi, 2, roberto_beruschi
6, roberto_beruschi, 2, kirstin07_638
8, roberto_beruschi, 2, carmen30_677
5, kapryar, 3, mdickinson_115
10, russ70_424, 7, zborer_228
7, berge.colin_657, 9, russ70_424
9, elijah.grant_674, 12, berge.colin_657
Por ejemplo user_id =2, que es roberto_beruschi, es amigo a si mismo, como el usuario founder
y hay usuarios que no son amigos
Lo correcto seria por ejemplo, user_id =2, que es roberto_beruschi, es amigo de:
id, follower_id, following_id, active
1, 2, 1, 1
5, 2, 3, 1
7, 2, 9, 1
9, 2, 12, 1
En otras palabras
user_id, username, first_name, last_name
1, founder, Walter, Sánchez
3, kapryar, kapry, ar
9, berge.colin_657, Nadia, Gomez
12, elijah.grant_674, Rollin, Lowe
Agradezco la gentileza a quienes me ayuden a resolver cada uno de los puntos que he mencionado.
Aguardo respuestas.
Que tengan un excelente día.
Que tengan éxitos en sus proyectos
Saludos Votos: 1 - Respuestas: 7 - Vistas: 11 Compartir en: Google Facebook Twitter LinkedIn Link
Respuestas:
-
Fecha: 15-11-2021 12:34:19 Ante todo Walter, un gusto leerte, muy buena explicación/introducción a tu pregunta.
Te dejo una pregunta con retorica, necesitas la columna "id" en la tabla "Wo_Followers"? (yo creería que no)
Respecto a la query 1), creo que tenes un error en el primer INNER JOIN, fijate en el ON que relacionas el A.user_id con el B.id (este último id es el que te comento que tal vez no tenes que usar en la tabla "Wo_Followers"
Por último, un consejo respecto a los nombres de tablas, siempre en minúsculas, o sea "Wo_Followers" sería "wo_followers" ya que el soporte de mayúsculas en MySQL no está habilitado por defecto y esto podría traerte problemas en algunos servidores.
Saludos y buen código! Votos: 1 - Link respuesta -
Fecha: 15-11-2021 17:59:54 Hola Fernando, tambien es un placer leerte y aun más que te hayas tomado la molestia en responder a mi consulta
en cuanto a:
Te dejo una pregunta con retorica, necesitas la columna "id" en la tabla "Wo_Followers"? (yo creería que no)
iEn cuanto a la columna "id" en la tabla "Wo_Followers" el motivo es cuando algún usuario deja de ser amigo por medio de tal id se elimina de la tabla "Wo_Followers" o bien para el registro en algún caso en particular
Por último, un consejo respecto a los nombres de tablas, siempre en minúsculas, o sea "Wo_Followers" sería "wo_followers" ya que el soporte de mayúsculas en MySQL no está habilitado por defecto y esto podría traerte problemas en algunos servidores.
Muy buena observación a tal caso. La estructura de la base de datos ya estaba armada de esa marea y son muchas tablas con datos, esta funcionado actualmente de esa manera, renomabrarlas ahora es entrar en riego que algo comience a fallar. Es una buena practica a tener en cuenta lo que has mencionado
Respecto a la query 1), creo que tenes un error en el primer INNER JOIN, fijate en el ON que relacionas el A.user_id con el B.id (este último id es el que te comento que tal vez no tenes que usar en la tabla "Wo_Followers"
Reveré ese punto y haré otras pruebas.
Hace tanto tiempo que no toco codigo que ne he estado oxidando y mucho más con MySQL. Volví al ruedo casi volviendo desde cero :(
Muchas gracias por toda tu atención.
Que tengas un buen día y éxitos en cada uno de tus proyectos.
Saludos!
Están todos invitados a participar de esta consulta Votos: 1 - Link respuesta -
Fecha: 16-11-2021 02:42:41 Buenisimo lo que contas Walter, fijate que no necesitas un id para eliminar una relación de la tabla, porque podes usar como clave primaria una clave compuesta por follower_id y following_id.
Entonces al momento de eliminar la relación en vez de hacer una query tipo:
DELETE FROM Wo_Followers WHERE id = 1;
Hacer algo como lo siguiente:
DELETE FROM Wo_Followers WHERE follower_id = 2 AND following_id = 1;
Saludos y buen código! Votos: 1 - Link respuesta -
Fecha: 17-11-2021 21:07:35 Muchas gracias Fernando por la sugerencia que no se requiere un Id en la tabla 'Wo_Followers', lo tendré presente para futuros proyectos, en el actual continuaré como se encuentra porque no quiero alterar la tabla y de pronto encontrarme con fallos, son muchísimos scripts con miles de lineas.
Me he puesto a repasar todo y he logrado resolver las 4 consignas que he plateado en el post.
Presentare las respuesta por cada punto a fin que le pueda servir alguien más con similares dudas y ademas para que Uds puedan hacerme alguna observación si se pueden mejorar las Querys.
Recapitulando, ya que he alterado unos datos de la tabla: Wo_Followers
Le mostrare las tablas y la explicación de las mismas, luego plantearé el problema con su respectiva resolución.
Tabla: Wo_Users (Todos los usuarios registrados)
user_id, username, first_name, last_name
1, 'founder', 'Walter', 'Sánchez'
2 'roberto_beruschi', 'Roberto', 'Bersuschi'
3, 'kapryar', 'kapry', 'ar'
4, 'cremin.nikita_905', 'Markus', 'Denesik'
5, 'mdickinson_115', 'Mozell', 'Ortiz'
6, 'kirstin07_638', 'Esther', 'White'
7, 'russ70_424', 'Ayla', 'Labadie'
8, 'carmen30_677', 'Magnolia', 'Fay'
9, 'berge.colin_657', 'Nadia', 'Gomez'
10, 'zborer_228', 'Abby', 'Waelchi'
11, 'shoeger_459', 'Emmanuelle', 'Schoen'
12, 'elijah.grant_674', 'Rollin', 'Lowe'
13, 'dorian.jacobi_982', 'Octavia', 'Schmidt'
Tabla: Wo_Followers
Contiene las relaciones de amistad, las que son amigos y las que aun no se ha aceptado la amistad, si el valor del campo active, es 0 es porque la solicitud no ha sido aceptada por lo tanto no son amigos, con valor 1 son amigos
id, follower_id, following_id, active
1, 1, 2, 1
2, 2, 1, 1
5, 3, 2, 1
6, 2, 3, 1
7, 9, 2, 1
8, 2, 9, 1
9, 12, 2, 0
10, 7, 2, 0
following_id: es id del usuario que envió la solicitud de amistad (el seguidor)
follower_id: es el id del usuario a quien se le envió la solicitud de amistad (el seguido)
active: con valor 1 son amigos, con valor 0 no son amigos aun.
Las query que necesito son las siguientes:
1) Necesito listar a todos los usuarios de la tabla Wo_Followers, a quien tiene como amigo. Amistad Aceptada, campo active=1
SELECT Amigos.id, Amigos.follower_id, Usuarios.username AS usuario, Amigos.following_id, AmigoDe.username AS amigo_de_usuario, Amigos.active FROM Wo_Followers AS Amigos INNER JOIN Wo_Users AS Usuarios ON Usuarios.user_id = Amigos.follower_id INNER JOIN Wo_Users AS AmigoDe ON AmigoDe.user_id = Amigos.following_id WHERE Amigos.active =1 ORDER BY Amigos.follower_id;
Resulta:
id, follower_id, usuario, following_id, amigo_de_usuario, active
2, 1, founder, 2, roberto_beruschi, 1
1, 2, roberto_beruschi, 1, founder, 1
5, 2, roberto_beruschi, 3, kapryar, 1
7, 2, roberto_beruschi, 9, berge.colin_657, 1
6, 3, kapryar, 2, roberto_beruschi, 1
8, 9, berge.colin_657, 2, roberto_beruschi, 1
2) Necesito saber de cada usuario a quien le envió la solicitud y aun no fue aceptada (por medio del
campo active =0)
SELECT Amigos.id, Amigos.follower_id, Usuarios.username AS usuario, Amigos.following_id, AmigoDe.username AS amigo_de_usuario, Amigos.active FROM Wo_Followers AS Amigos INNER JOIN Wo_Users AS Usuarios ON Usuarios.user_id = Amigos.follower_id INNER JOIN Wo_Users AS AmigoDe ON AmigoDe.user_id = Amigos.following_id WHERE Amigos.active = 0 ORDER BY Amigos.follower_id;
Resulta:
id, follower_id, usuario, following_id, amigo_de_usuario, active
9, 2, roberto_beruschi, 12, elijah.grant_674, 0
10, 2, roberto_beruschi, 7, russ70_424, 0
3) Necesito saber de un usuario en particular, por ejemplo username= ''roberto_beruschi', que amigos tiene, solicitud aceptada, campo active =1 .
PD// agregue que muestre el nombre y apellido (concatenado de la tabla Wo_Users) de su amigo. Utilizando la función CONCAT_WS() resultando: nombre, apellido
SELECT Amigos.id, Amigos.follower_id, Usuarios.username, Amigos.following_id, AmigoDe.username AS amigo_de_usuario, CONCAT_WS(", ",Usuarios.first_name, Usuarios.last_name) AS nombre_apellido_del_amigo, Amigos.active FROM Wo_Followers AS Amigos INNER JOIN Wo_Users AS Usuarios ON Usuarios.user_id = Amigos.follower_id INNER JOIN Wo_Users AS AmigoDe ON AmigoDe.user_id = Amigos.following_id WHERE Usuarios.username = 'roberto_beruschi' AND Amigos.active =1 ORDER BY Amigos.follower_id;
Resulta:
id, follower_id, username, following_id, amigo_de_usuario, nombre_apellido_del_amigo, active
1, 2, roberto_beruschi, 1, founder, Roberto, Bersuschi, 1
5, 2, roberto_beruschi, 3, kapryar, Roberto, Bersuschi, 1
7, 2, roberto_beruschi, 9, berge.colin_657, Roberto, Bersuschi, 1
4) Necesito saber de un usuario en particular, por ejemplo username= ''roberto_beruschi', a que a usuario le envió la solicitud y no fue aceptada, campo active =0
PD// agregue que muestre el nombre y apellido (concatenado de la tabla Wo_Users) de su amigo. Utilizando la función CONCAT_WS() resultando_ nombre, apellido
Es la misma query anterior solo cambiar el campo active=1 a active=0
SELECT Amigos.id, Amigos.follower_id, Usuarios.username, Amigos.following_id, AmigoDe.username AS amigo_de_usuario, CONCAT_WS(", ",Usuarios.first_name, Usuarios.last_name) AS nombre_apellido_del_amigo, Amigos.active FROM Wo_Followers AS Amigos INNER JOIN Wo_Users AS Usuarios ON Usuarios.user_id = Amigos.follower_id INNER JOIN Wo_Users AS AmigoDe ON AmigoDe.user_id = Amigos.following_id WHERE Usuarios.username = 'roberto_beruschi' AND Amigos.active =0 ORDER BY Amigos.follower_id;
Resulta:
id, follower_id, username, following_id, amigo_de_usuario, nombre_apellido_del_amigo, active
9, 2, roberto_beruschi, 12, elijah.grant_674, Roberto, Bersuschi, 0
10, 2, roberto_beruschi, 7, russ70_424, Roberto, Bersuschi, 0
Hasta allí, quedaron respondidos los 4 incisos.
Ademas, en este momento, agregue 2 puntos extras. Son los siguientes.
5) Necesito saber de cada usuario cuantos amigos tiene, solicitud aceptada, campo active =1
SELECT Amigos.id, Amigos.follower_id, Usuarios.username AS usuario, Amigos.active, COUNT(1) AS Cant_Amigos FROM Wo_Followers AS Amigos INNER JOIN Wo_Users AS Usuarios ON Usuarios.user_id = Amigos.follower_id INNER JOIN Wo_Users AS AmigoDe ON AmigoDe.user_id = Amigos.following_id WHERE Amigos.active = 1 GROUP BY Usuarios.username ORDER BY Amigos.id;
Resulta:
id, follower_id, usuario, active, Cant_Amigos
1, 2, roberto_beruschi, 1, 3
2, 1, founder, 1, 1
6, 3, kapryar, 1, 1
8, 9, berge.colin_657, 1, 1
6) Necesito saber de cada usuario a cuantos amigos le envió la solicitud de amistad y aun no ha sido aceptada, campo active =0
Es la misma query anterior solo cambiar el campo active=1 a active=0
SELECT Amigos.id, Amigos.follower_id, Usuarios.username AS usuario, Amigos.active, COUNT(1) AS Cant_Amigos FROM Wo_Followers AS Amigos INNER JOIN Wo_Users AS Usuarios ON Usuarios.user_id = Amigos.follower_id INNER JOIN Wo_Users AS AmigoDe ON AmigoDe.user_id = Amigos.following_id WHERE Amigos.active = 0 GROUP BY Usuarios.username ORDER BY Amigos.id;
Resulta:
id, follower_id, usuario, active, Cant_Amigos
9, 2, roberto_beruschi, 0, 2
En ambas Querys utilice COUNT(1) en vez de COUNT(*) porque leí por ahí que es más rápida la consulta
COUNT(*) cuenta los registros de la SELECT guardando en memoria las columnas de las consultas, es decir si en la consulta tienes 20 columnas y 300 registros, el guardara los 6000 espacios en memoria con su data. lo cual demoraria el procesamiento de la consulta.
COUNT(columna) cuenta los registros en los cuales "columna" no es NULL
COUNT(n) (donde n es un numero) toma el valor n (en este caso) como una tabla de unica columna donde su valor por cada registro es n para cada registro, no importando que sea de 20 columnas. para el ejemplo del primer caso, serian solo 300 * 1 = 300 valores, lo cual procesaría más rápidamente la consulta.
Espero que lean mis respuestas y me comenten que mejoras se puede realizar en las Querys.
Muchas gracias por todo, espero que el post le sirva en algún momento a alguien.
Saludos Votos: 1 - Link respuesta -
Fecha: 18-11-2021 03:54:25 Muy bueno Walter +1
Yo le agregaría un cambio a los WHERE cuando filtras por usuarios especifico, en vez de hacerlo por "username" lo haría por "user_id", ya que seguramente al momento de hacer la query tenes este dato disponible.
Saludos y buen código! Votos: 1 - Link respuesta -
Fecha: 18-11-2021 04:09:11 Pasaré el post a resuelto por cuestión organizativa de la comunidad, pero pueden seguir comentado
Saludos Votos: 0 - Link respuesta -
Fecha: 18-11-2021 19:00:30 en vez de hacerlo por "username" lo haría por "user_id"
Es una muy buena idea ya que generalmente se utiliza el id para referenciarse al registro
Muchas gracias
Saludos Votos: 1 - Link respuesta
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
