2010-04-04 3 views
0

J'ai 2 tables: 1ère détient les employés (de ceux dans toutes les positions) et le 2e détient les relations de travail du gestionnaire avec des numéros d'identification.même tableau, 1 champ à 2 requête sur le terrain

Je veux écrire une requête comme

1st field: name(employee), 
2nd field: name(manager) 

Comment puis-je faire cela?

Répondre

2

Aucune requêtes imbriquées requis , utilisez simplement des jointures standard:

select e.*, m.* 
from 
    employee e 
    left join employee_managers em 
     on e.id = em.emp_id 
    left join employee m 
     on m.id = em.man_id 

Chaque ligne contiendra tous les champs de employee (éventuellement plusieurs lignes pour un employé s'il a plusieurs gestionnaires associés) et tous les champs de son gestionnaire correspondant (ou NULL si l'employé n'a pas de responsable).

+0

oui, ma solution était juste au-dessus, ems mysql manager l'a fait pour moi par hasard. :) – edib

1

Vous pouvez le faire avec une table:

Employee 
-------- 
EmployeeId int 
Name varchar(50) 
ManagerId int 

ManagerId des points à l'entrée du gestionnaire dans la même table. Le chef de la direction aura un ID de gestionnaire de null. Une définition de la table exemple:

create table Employees (
    EmployeeId int auto_increment primary key 
, Name varchar(50) 
, ManagerId int 
, foreign key (ManagerId) references Employees(EmployeeId) 
); 

Avec quelques exemples de données:

insert into Employees (Name) select 'The Chief'; 
insert into Employees (Name, ManagerId) select 'Grunt 1', 
    (select EmployeeId from Employees where Name = 'The Chief'); 
insert into Employees (Name, ManagerId) select 'Grunt 2', 
    (select EmployeeId from Employees where Name = 'The Chief'); 
insert into Employees (Name, ManagerId) select 'Secretary', 
    (select EmployeeId from Employees where Name = 'The Chief'); 

Pour trouver le nom du deuxième gestionnaire de Grunt, vous pouvez interroger comme:

select mgr.Name 
from Employees mgr 
inner join Employees grunt 
on grunt.managerid = mgr.employeeid 
where grunt.name = 'Grunt 2'; 
+0

Je pense qu'ils sont plusieurs-à-plusieurs dans le cas de l'auteur. – incarnate

+1

@incarnate: Droit .... mal lu la question. Votre réponse a déjà la bonne solution Je vais voter pour elle – Andomar

+0

vôtre est toujours une bonne solution si elles veulent refactoriser leur DB :-) +1 pour l'effort. – bernie

Questions connexes