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

¿Como puedo hacer esta consulta?

Estas en el tema de ¿Como puedo hacer esta consulta? en el foro de Mysql en Foros del Web. Hola a todos, vereis tengo un sistema para que mis usuarios creen amistades entre ellos, el tema es que me gustaría que cuando el usuario ...
  #1 (permalink)  
Antiguo 30/11/2011, 15:08
 
Fecha de Ingreso: marzo-2011
Mensajes: 88
Antigüedad: 13 años, 1 mes
Puntos: 17
¿Como puedo hacer esta consulta?

Hola a todos, vereis tengo un sistema para que mis usuarios creen amistades entre ellos, el tema es que me gustaría que cuando el usuario pinche a una sección que tengo llamada "miembros", esta sección me muestre todos los miembros registrados en la página, MENOS los que este usuario tiene agregados como amigos...

No se como plantearlo la verdad, si alguien me puede orientar un poco, lo agradecería.

En mi tabla de amistades tengo lo siguiente:

Cita:

id_amistad || id_usuario_a || id_usuario_b || estado
Y en la de usuarios, pues bastantes datos pero simplifico...


Cita:

id_usuario || nombre || apellidos
  #2 (permalink)  
Antiguo 30/11/2011, 15:33
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: ¿Como puedo hacer esta consulta?

Hola follow:

Creo que un simple NOT EXIST serviría:

Código:
SELECT * FROM usuarios U WHERE NOT EXISTS
(
SELECT * FROM amistades A 
where A.id_usuario_A = T1.id_usuario
and A.id_usuario_B = 'id_del_usuario_que_dio_clic_en_miembros')
Esto serviría para excluir los elementos en donde el usuario que está consultanto aparezca en el campo id_usuario_b de tu tabla de amistades... habría también que agregar el caso para excluir el caso donde aparece en el campo id_usuario_a... haz la prueba y nos comentas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 30/11/2011, 17:15
 
Fecha de Ingreso: marzo-2011
Mensajes: 88
Antigüedad: 13 años, 1 mes
Puntos: 17
Respuesta: ¿Como puedo hacer esta consulta?

Muchisimas gracias por tu ayuda! Va bien pero al hacer las comparaciones algo hago mal......

Digamos que el 'id' del usuario que está navegando es "12", entonces hago lo siguiente, para no mostrarle en la lista ni a el mismo ni a sus amigos:

Cita:
SELECT * FROM usuarios U WHERE NOT exists (SELECT * FROM amistades A where A.id_usuario_a = U.id_usuario and A.id_usuario_b = '12' or A.id_usuario_a = '12' and A.id_usuario_b = U.id_usuario );
El problema es que me funciona bien, me elimina los amigos asociados a este 'id' pero su id me sigue saliendo!! Osea que me muestra a el mismo!! Alguien ve el fallo?? Muchas gracias de verdad por la ayuda!
  #4 (permalink)  
Antiguo 30/11/2011, 17:22
 
Fecha de Ingreso: marzo-2011
Mensajes: 88
Antigüedad: 13 años, 1 mes
Puntos: 17
Respuesta: ¿Como puedo hacer esta consulta?

Hola vuelvo a escribir para decir que así:

Cita:
SELECT * FROM usuarios U WHERE NOT exists (SELECT * FROM amistades A where A.id_usuario_a = U.id_usuario and A.id_usuario_b = '12' or A.id_usuario_a = '12' and A.id_usuario_b = U.id_usuario or U.id_usuario='12' );
Sí que funciona, osea me omite los amigos del usuario Y a el usuario en cuestion, pero no se si es la manera mas correcta de hacerlo, ya que lo he conseguido hacer a base de pruebas con poco fundamento... Perdón por mi ignorancia pero es que voy aprendiendo poco a poco y con la ayuda de vosotros que sois geniales.
  #5 (permalink)  
Antiguo 01/12/2011, 09:15
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: ¿Como puedo hacer esta consulta?

Hola de nuevo follow:

Hay que tener cuidado cuando en una condición WHERE mezcles condiciones AND y OR, ya que por jerarquía de operadores se ejecutan primero las condiciones AND que las OR...

En matemáticas 2+3*4 no es lo mismo que (2+3)*4... hay que utilizar paréntesis para asegurar que el orden de las comparaciones es el que queremos. en tu caso debería ser más o menos así:

Código:
SELECT * FROM usuarios U WHERE NOT exists (
SELECT * FROM amistades A 
where 
(A.id_usuario_a = U.id_usuario and A.id_usuario_b = '12') or 
(A.id_usuario_b = U.id_usuario and A.id_usuario_a = '12') 
);
Los paréntesis en rojo sirven para agrupara las condiciones para cada uno de los casos (el id del usuario en el campo A o en el campo B)... ahora bien, para excluir al usuario que hace la consulta del resultado final, puedes agregar una condición WHERE en la consulta externa, la consulta quedaría más o menos así:

Código:
SELECT * FROM usuarios U WHERE NOT exists (
SELECT * FROM amistades A 
where 
(A.id_usuario_a = U.id_usuario and A.id_usuario_b = '12')
or (A.id_usuario_a = '12' and A.id_usuario_b = U.id_usuario) 
)
AND U.id_usuario != '12';
Haz la prueba y nos comentas
Leo.

Etiquetas: tabla
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 01:38.