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

Ayuda con consulta relacionadas

Estas en el tema de Ayuda con consulta relacionadas en el foro de Bases de Datos General en Foros del Web. Hola amigos, por favor me gustaria que me dieran una mano. Estoy realizando un pequeno proyecto y estoy trabajando con la parte de usuarios,grupos. Tengo ...
  #1 (permalink)  
Antiguo 26/08/2009, 10:26
 
Fecha de Ingreso: julio-2009
Mensajes: 34
Antigüedad: 14 años, 9 meses
Puntos: 0
Ayuda con consulta relacionadas

Hola amigos, por favor me gustaria que me dieran una mano.

Estoy realizando un pequeno proyecto y estoy trabajando con la parte de
usuarios,grupos.

Tengo tres tablas

- User
- Group
- Relacion (User,Group,Company);


-- Tabla User --
Código:
Codigo | Nombre  | Company
-------------------------------------
1	 Miguel      1
2        Juan        1
3        Pedro       2 


CREATE TABLE  `ejemplo`.`user` (
  `Codigo` int(11) NOT NULL auto_increment,
  `Nombre` varchar(45) NOT NULL default '',
  `Company` int(11) NOT NULL default '0',
  PRIMARY KEY  (`Codigo`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


--- Tabla Group ---
Código:
Codigo | Nombre
---------------------------
1        Prueba_1
2        Prueba_2



CREATE TABLE  `ejemplo`.`group` (
  `Codigo` int(11) NOT NULL auto_increment,
  `Nombre` varchar(45) NOT NULL default '',
  PRIMARY KEY  (`Codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--- Tabla Relacion ---

Código:
User | Group | Company
--------------------------------
1       1        1
2       1        1



CREATE TABLE  `ejemplo`.`relacion` (
  `Codigo` int(11) NOT NULL auto_increment,
  `User` int(11) NOT NULL default '0',
  `Group` int(11) NOT NULL default '0',
  `Company` int(11) NOT NULL default '0',
  PRIMARY KEY  (`Codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

En el ejemplo de -- Tabla relacion-- Miguel y Juan estan en el grupo Prueba_1



Me gustaria saber como hacer el query de la base de datos , para saber los usuarios que prueba_1 contiene y cuales usuarios no estan presente en ese grupo.

Actualmente tengo este codigo


-- Este codigo supuestamente mostraria los usuarios que estan fuera del grupo Prueba_1 , el caso es que no funciona --

Código SQL:
Ver original
  1. SELECT * FROM tb_user LEFT JOIN relacion ON USER.codigo = relacion.USER LEFT JOIN GROUP ON GROUP.codigo = 1
  2. WHERE USER.company = 1 AND relacion.GROUP IS NULL



-- Este codigo supuestamente mostraria los usuarios que estan dentro del grupo Prueba_1 , el caso es que no funciona tampoco--

Código SQL:
Ver original
  1. SELECT * FROM tb_user LEFT JOIN relacion ON USER.codigo = relacion.USER LEFT JOIN GROUP ON GROUP.codigo = 1
  2. WHERE USER.company = 1 AND relacion.GROUP IS NULL

De ante mano muchas gracias.
  #2 (permalink)  
Antiguo 26/08/2009, 11:10
 
Fecha de Ingreso: julio-2009
Ubicación: .mysql_error ( XD )
Mensajes: 554
Antigüedad: 14 años, 9 meses
Puntos: 13
Respuesta: Ayuda con consulta relacionadas

y por qué todo tan separado?
desde mi punto de vista la tabla relación que tienes es redundancia de datos (aunque sin los mismos datos) podrias haber hecho eso en 2 tablas
aunque yo hubiera hecho todo eso en una sola tabla...

otra cosa... dices que los codigos no te funcionan... ante ello pregunto...
Qué es lo que no funciona?
cuál es el mensaje de error?

que más da...
el codigo que tienes solo está acaparando 2 tablas, user y relacion y no la de grupo y tambien porque ordenas por grupo cuando no los tienes en las tablas mencionadas.

Group es una palabra propia del lenguaje sql (reservada) por lo cual no puedes poner ese nombre a una tabla, de lo contrario al llamarla se interpretara como que estas llamando a un grupo de datos en particular y no a tu tabla...


debes partir por modificar eso...
  #3 (permalink)  
Antiguo 26/08/2009, 11:43
 
Fecha de Ingreso: julio-2009
Mensajes: 34
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Ayuda con consulta relacionadas

Gracias por responder.
Te explico , para poder hacer un sistema de usuarios con grupos siempre lo he visto con tres tablas
No tengo idea como puedes hacer todo en una tabla sin k cada cosa sea independiente.
Lo digo por que si te fijas en el campo company hace referencia a una compania en especifico
Cada compania van a tener usuarios y grupos distintos.

Cuando hacces referencia al group es cierto es una palabra reservada de sql pero esto no da error realmente
A mi me funciona y yo utilizo mysql 5.1

En si la consulta no me da error , el problema es q esta mal formulada , no genera realmente el dato esperado
Si hace el query con otro grupo te genera el mismo resultado , es como si ignorarara el codigo del grupo
  #4 (permalink)  
Antiguo 27/08/2009, 10:28
 
Fecha de Ingreso: julio-2009
Ubicación: .mysql_error ( XD )
Mensajes: 554
Antigüedad: 14 años, 9 meses
Puntos: 13
Respuesta: Ayuda con consulta relacionadas

fácil...

la tabla users llevaría los siguientes campos
id, nombre, compañia, grupo

despues simplemente haces consultas básicas para mostrar los datos
y si haces el ingreso de datos (registro de usuario) por interfaz, sentencias los combobox para que muestren la información que necesitas.

una inquietud...
por qué ese afán de usar conceptos en ingles?
o es que tu sistema lo estas haciendo para gente que habla ingles?

y por último, siempre que uses una palabra reservada está siempre funcionara como tal de la manera que la estás empleando, pero por otro lado... tienes mil palabras más... por qué usar una que sea reservada?

evitate problemas amigo...
esop..
saludos

cualquier otra inquietud simplemente lo haces
(*esto es solo lo que yo haría)
  #5 (permalink)  
Antiguo 27/08/2009, 12:08
 
Fecha de Ingreso: julio-2009
Mensajes: 34
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Ayuda con consulta relacionadas

Gracias nuevamente Twonex,

La forma que propones de usar la tabla no esta mal , pero para lo que estoy haciendo no funciona, lo que pretendo hacer es que un mismo usuario
Puede estar desde 1 hasta 1000 grupos que quiera ponerlo el administrador de esa compania.

Seria una tabla con una relacion 1:N

O sea cuando me refiero a grupos no me refiero a permisos
ejem Admin , Oper, User etc .
Me refiero basicamente a grupos de ordenamiento que el administrador crea para organizar sus usuarios.


2- Tienes razon con lo de las palbras en ingles , es que antes estava trabajando en un proyecto multilenguaje y se me quedo esa manera XD , pero ya ire cambiando.


3- Tienes razon con lo de la palabra reservada
no me estava dando error mientra la utilizaba de esta forma
Código SQL:
Ver original
  1. SELECT * FROM users WHERE users.GROUP =1
Luego que quise utilizarla
de esta
Código SQL:
Ver original
  1. SELECT * FROM users WHERE GROUP =1
Si me dio error.

He ya encontre la solucion al problema.
Lo unico malo fue que la solucion la tube que aplicar mediante codigo php

dos consultas y luego trabajar con array_intersect y es con eso que saco el resultado.
Funciona perfecto.
Tratandolo de hacer con mysql me tomo casi el dia completo , pensar hacerlo con php solo me tomo 15 minutos.
A un que no descarto la manera de como hacerlo mediante una sola consulta, ya ire buscando mas soluciones.
  #6 (permalink)  
Antiguo 27/08/2009, 14:18
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ayuda con consulta relacionadas

Estas consultas podrían resultarte. Son distintas y en una cruzo tres tablas y en otra solo dos.
Los que pertenecen al grupo 'prueba_1'.
SELECT `user`.Nombre
FROM `relacion`
INNER JOIN `group` ON relacion.`group` = `group`.codigo
INNER JOIN `user` ON `user`.codigo = relacion.`User`
WHERE `group`.nombre = 'prueba_1'

Los que no (una version más reducida de los datos, aunque podía hacerse con las tres tablas cruzadas)
SELECT `user`.Nombre
FROM `user` LEFT JOIN relacion ON `user`.codigo = relacion.`User` AND relacion.`group`= 1 where relacion.codigo is null

Ah, y escucha el buen consejo de Twonex sobre evitar el uso de palabras reservadas

Y otra cosa: yo soy partidario de resolver con PHP muchas cosas, pero esto son tareas propias de la base; además, saber todo eso te ayudará a mejorar la estructura de la base y a hacerla más eficiente.
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 13:58.