Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

query amistad

Estas en el tema de query amistad en el foro de Mysql en Foros del Web. Buenas, Tengo dos tablas, usuarios y amigos. hice una query que me da los amigos de x usuarios. Un ejemplo con id de usuario 21 ...
  #1 (permalink)  
Antiguo 21/08/2012, 05:46
 
Fecha de Ingreso: noviembre-2007
Mensajes: 471
Antigüedad: 16 años, 5 meses
Puntos: 2
query amistad

Buenas,

Tengo dos tablas, usuarios y amigos. hice una query que me da los amigos de x usuarios.

Un ejemplo con id de usuario 21
NOTA : el campo id_usuario es el que envía la petición, el otro es el que la acepta
Query:

Código MySQL:
Ver original
  1.   *
  2. FROM amigos
  3.   id_usuario = 21
  4.   id_usuario2 = 21

hasta aca todos bien. el problema vino cuando se me dio por obtener la información(nombre, calle...) de cada amigo encontrado.

Query
Código MySQL:
Ver original
  1.  usu.*
  2. FROM amigos ami
  3. INNER JOIN usuarios usu
  4. ON usu.id_usuario2 = ami.id_usuario
  5.   ami.id_usuario = 21
  6.   ami.id_usuario2 = 21

Como pueden observar el problema esta en el inner join porque yo busco información sobre el campo id_usuario2 (son los que aceptan la peticion de amistad) pero puede ser que el usuario con el id 21 sea invitado.

Como puedo solucionar esto??? ç

Saludos
  #2 (permalink)  
Antiguo 21/08/2012, 10:03
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: query amistad

Hola Blashak:

Este es un problema que hemos comentado muchas veces en el foro, depende mucho de cómo quieres presentar tu información. Una posible respuesta sería utilizando un doble INNER JOIN sobre la tabla de usuarios, utilizando un ALIAS, esto sería más o menos así, supongamos que tienes esta información:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM usuarios;
  2. +------+--------+
  3. | id   | nombre |
  4. +------+--------+
  5. |    1 | HUGO   |
  6. |    2 | PACO   |
  7. |    3 | LUIS   |
  8. |    4 | DONALD |
  9. +------+--------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM amigos;
  13. +------+------------+-------------+
  14. | id   | id_usuario | id_usuario2 |
  15. +------+------------+-------------+
  16. |    1 |          1 |           2 |
  17. |    2 |          1 |           3 |
  18. |    3 |          2 |           3 |
  19. |    4 |          4 |           1 |
  20. +------+------------+-------------+
  21. 4 rows in set (0.00 sec)

Supongamos que quieres obtener la lista de amigos del usuario 1 = HUGO, podrías hacerlo asi:

Código MySQL:
Ver original
  1. mysql> SELECT U1.*, U2.* FROM amigos A
  2.     -> INNER JOIN usuarios U1 ON U1.id = A.id_usuario
  3.     -> INNER JOIN usuarios U2 ON U2.id = A.id_usuario2
  4.     -> WHERE A.id_usuario = 1 OR A.id_usuario2 = 1;
  5. +------+--------+------+--------+
  6. | id   | nombre | id   | nombre |
  7. +------+--------+------+--------+
  8. |    4 | DONALD |    1 | HUGO   |
  9. |    1 | HUGO   |    2 | PACO   |
  10. |    1 | HUGO   |    3 | LUIS   |
  11. +------+--------+------+--------+
  12. 3 rows in set (0.00 sec)

Observa que en cada registro se repite la información del usuario HUGO, si sólo quieres listar la información de sus amigos, también lo puedes hacer con un UNION:

Código MySQL:
Ver original
  1. mysql> SELECT U.* FROM amigos A
  2.     -> INNER JOIN usuarios U ON U.id = A.id_usuario2
  3.     -> WHERE A.id_usuario = 1
  4.     -> UNION
  5.     -> SELECT U.* FROM amigos A
  6.     -> INNER JOIN usuarios U ON U.id = A.id_usuario
  7.     -> WHERE A.id_usuario2 = 1;
  8. +------+--------+
  9. | id   | nombre |
  10. +------+--------+
  11. |    2 | PACO   |
  12. |    3 | LUIS   |
  13. |    4 | DONALD |
  14. +------+--------+
  15. 3 rows in set (0.00 sec)

Creo que esto te debe servir. Dale un vistazo y nos comentas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 22/08/2012, 04:25
 
Fecha de Ingreso: noviembre-2007
Mensajes: 471
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: query amistad

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola Blashak:

Este es un problema que hemos comentado muchas veces en el foro, depende mucho de cómo quieres presentar tu información. Una posible respuesta sería utilizando un doble INNER JOIN sobre la tabla de usuarios, utilizando un ALIAS, esto sería más o menos así, supongamos que tienes esta información:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM usuarios;
  2. +------+--------+
  3. | id   | nombre |
  4. +------+--------+
  5. |    1 | HUGO   |
  6. |    2 | PACO   |
  7. |    3 | LUIS   |
  8. |    4 | DONALD |
  9. +------+--------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM amigos;
  13. +------+------------+-------------+
  14. | id   | id_usuario | id_usuario2 |
  15. +------+------------+-------------+
  16. |    1 |          1 |           2 |
  17. |    2 |          1 |           3 |
  18. |    3 |          2 |           3 |
  19. |    4 |          4 |           1 |
  20. +------+------------+-------------+
  21. 4 rows in set (0.00 sec)

Supongamos que quieres obtener la lista de amigos del usuario 1 = HUGO, podrías hacerlo asi:

Código MySQL:
Ver original
  1. mysql> SELECT U1.*, U2.* FROM amigos A
  2.     -> INNER JOIN usuarios U1 ON U1.id = A.id_usuario
  3.     -> INNER JOIN usuarios U2 ON U2.id = A.id_usuario2
  4.     -> WHERE A.id_usuario = 1 OR A.id_usuario2 = 1;
  5. +------+--------+------+--------+
  6. | id   | nombre | id   | nombre |
  7. +------+--------+------+--------+
  8. |    4 | DONALD |    1 | HUGO   |
  9. |    1 | HUGO   |    2 | PACO   |
  10. |    1 | HUGO   |    3 | LUIS   |
  11. +------+--------+------+--------+
  12. 3 rows in set (0.00 sec)

Observa que en cada registro se repite la información del usuario HUGO, si sólo quieres listar la información de sus amigos, también lo puedes hacer con un UNION:

Código MySQL:
Ver original
  1. mysql> SELECT U.* FROM amigos A
  2.     -> INNER JOIN usuarios U ON U.id = A.id_usuario2
  3.     -> WHERE A.id_usuario = 1
  4.     -> UNION
  5.     -> SELECT U.* FROM amigos A
  6.     -> INNER JOIN usuarios U ON U.id = A.id_usuario
  7.     -> WHERE A.id_usuario2 = 1;
  8. +------+--------+
  9. | id   | nombre |
  10. +------+--------+
  11. |    2 | PACO   |
  12. |    3 | LUIS   |
  13. |    4 | DONALD |
  14. +------+--------+
  15. 3 rows in set (0.00 sec)

Creo que esto te debe servir. Dale un vistazo y nos comentas.

Saludos
Leo.
leonardo_josue,

muchas gracias, utilice la query de union.

Etiquetas: join, query, select, tabla, amistades, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:21.