[SQL] Problema con consulta

Iniciado por darknlee, 28 Enero 2014, 19:06 PM

0 Miembros y 1 Visitante están viendo este tema.

darknlee

Hola quería ver si me podéis echar una mano con una consulta SQL que me está costando sacar.
Tengo 2 tablas, Users y Groups_Users

Tabla Users: id, nombre, apellidos etc.
Tabla Groups_Users: idGrupo, idUsuario

El caso es que necesito obtener los usuarios que NO estén en ningún grupo o que estén en el grupo distinto al especificado. La consulta que estoy utilizando es la siguiente pero no me funciona:

SELECT u.id, u.nombre  FROM [Users] u LEFT JOIN Groups_Users g ON u.id=g.idUsuario WHERE g.idUsuario IS NULL OR g.idGrupo<>1; //Por ejemplo

La primera parte es correcta porque me trae los que no están en ningún grupo, es decir hasta aquí bien:
SELECT u.id, u.nombre  FROM [Users] u LEFT JOIN Groups_Users g ON u.id=g.idUsuario WHERE g.idUsuario IS NULL

La segunda parte es en la que tengo problemas.

PD: Estoy en SQL Server.

Un saludo

1mpuls0

#1
Podrías colocar un ejemplo para poder ver que es lo que necesitas exactamente.

Por lo que entiendo, esto debe funcionarte a menos que te yo este mal entendiendo el problema o no lo hayas explicado correctamente.

Código (sql) [Seleccionar]

SELECT  u.id, u.nombre, u.apellidos
FROM    users u
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    groups_users g
        WHERE   g.idusuario = u.id
        )
UNION
SELECT u.id, u.nombre, u.apellidos
FROM users u, groups_users g WHERE u.id=g.idusuario AND g.idgrupo<>4
abc

darknlee

Hola Darhius, antes de nada te agradezco mucho la respuesta, voy a poner un ejemplo porque igual no me he explicado correctamente.

Tengo el siguiente registro en la tabla Users:

id     Nombre     Apellidos
------------------------------ 
1   Perico    Palotes
2      Paco           Gómez
3      Roberto      García

En la tabla Groups_Users ( 1 usuario puede pertecenecer a 0 o a muchos grupos)

idGrupo   idUsuario
----------------------
1                1
2                3
3                1


Lo que quiero es realizar una consulta que me devuelva tanto los usuarios que no están en ningún grupo como los que no pertenecen a un grupo determinado, es decir que si lanzo la consulta de tal forma que me de los usuarios que no pertenecen al grupo 1 y a ningún grupo me de la siguiente salida:

id     Nombre     Apellidos
------------------------------ 
2      Paco           Gómez
3      Roberto      García

(omitiendo al usuario con id 1 porque uno de los grupos a los que pertenece es el grupo 1)

Un saludo,


Shell Root

No recuerdo mucho esto, pero espero no ser un tonto al decir que: quizás con un LEFT JOIN o RIGHT JOIN puedas obtener esos resultados. Es decir, -dependiendo del canal de retorno-
Código (sql) [Seleccionar]
SELECT usu.Id, usu.Nombre, usu.Apellido FROM usuario usu LEFT JOIN grupo grp ON grp.idUsuario = usu.id
ó
Código (sql) [Seleccionar]
SELECT usu.Id, usu.Nombre, usu.Apellido FROM usuario usu RIGHT JOIN grupo grp ON grp.idUsuario = usu.id

Pruba a ver que canal es,
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

1mpuls0

#4
Cita de: darknlee en 28 Enero 2014, 19:06 PM
El caso es que necesito obtener los usuarios que NO estén en ningún grupo o que estén en el grupo distinto al especificado.

Cita de: darknlee en 28 Enero 2014, 21:15 PM
e quiero es realizar una consulta que me devuelva tanto los usuarios que no están en ningún grupo como los que no pertenecen a un grupo determinado, es decir que si lanzo la consulta de tal forma que me de los usuarios que no pertenecen al grupo 1 y a ningún grupo me de la siguiente salida:

Ten más cuidado con lo que escribes porque se puede mal interpretar, tal y como lo hice yo.. por eso pedía un ejemplo, bueno ahora que lo tengo veamos que se puede hacer.



Edito:

Segun yo, con esto debe quedar xD

Código (sql) [Seleccionar]

SELECT  u.id, u.nombre, u.apellidos
FROM    users u
WHERE   NOT EXISTS ( SELECT  NULL FROM    groups_users g WHERE   g.idusuario = u.id )
UNION
SELECT u.id, u.nombre, u.apellidos  FROM groups_users g, users u WHERE g.idusuario=u.id AND g.idgrupo!=1
AND g.idusuario NOT IN(
SELECT gu.idusuario FROM groups_users gu WHERE gu.idgrupo=1)
abc

HdM

Otra opción podría ser:

Código (sql) [Seleccionar]

SELECT id, nombre  FROM Users
WHERE (id NOT IN (SELECT DISTINCT idUsuario FROM Groups_Users))
OR (id NOT IN (SELECT idUsuario FROM Groups_Users WHERE idGrupo=1))

- Nice to see you again -

darknlee

Cita de: Darhius en 29 Enero 2014, 00:05 AM
Ten más cuidado con lo que escribes porque se puede mal interpretar, tal y como lo hice yo.. por eso pedía un ejemplo, bueno ahora que lo tengo veamos que se puede hacer.

Toda la razón, es que me pasé de sol a sol programando y ya no sé ni lo que puse.

Muchísimas gracias a todos por vuestra ayuda, especialmente a ti Darhius ahora si que si. ;-)