2013-06-27 54 views
1

我的表是 '指定'找到销售员工的经理

ID || DEPT_ID  ||  E_NAME  ||  DESIGNATION 
1  ||  12   ||  A   ||  EMPLOYEE 
2  ||  12   ||  B   ||  MANAGER 
3  ||  12   ||  C   ||  EMPLOYEE 
4  ||  14   ||  D   ||  MANGER 
5  ||  14   ||  E   ||  EMPLOYEE 
6  ||  14   ||  F   ||  EMPLOYEE 

我想通过自己的DEPT_NAME经理的名字....

平均结果会像

ID || DEPT_ID  ||  E_NAME  ||  DESIGNATION || MANAGER 
1  ||  12   ||  A   ||  EMPLOYEE || B 
2  ||  12   ||  B   ||  MANAGER  || B 
3  ||  12   ||  C   ||  EMPLOYEE || B 
4  ||  14   ||  D   ||  MANGER  || D 
5  ||  14   ||  E   ||  EMPLOYEE || D 
6  ||  14   ||  F   ||  EMPLOYEE || D 

我的查询是

SELECT `ID`,`DEPT_ID`,`ENAME`,`DESIGNATION`, 
    (select `ENAME` from `DESIGNATION` where 
     (select `E_NAME` from `DESIGNATION` where 
      (SELECT `DEPT_ID` FROM `DESIGNATION` WHERE `DESIGNATION` = 'EMPLOYEE') 
      = 
      (SELECT `DEPT_ID` FROM `DESIGNATION` WHERE `DESIGNATION` = 'MANAGER') and `DESIGNATION`='MANAGER') 
    AS MANAGER 
from `DESIGNATION` 

但它不工作...

+2

你有一个翻两番嵌套子查询,你期望它的工作? –

+0

我不知道...请帮我... –

+0

所以B和D是他们的经理吗? –

回答

3

你只需要一个JOIN operation。这是使用数据库时的基本概念。你应该花一些时间阅读它。

这样的事情?

SELECT A.*, B.E_NAME 
    FROM DESIGNATION AS A, DESIGNATION AS B 
    WHERE B.DESIGNATION = "MANAGER" 
    AND A.DEPT_ID = B.DEPT_ID 

或者使用明确JOIN语法:

SELECT A.*, B.E_NAME 
    FROM DESIGNATION AS A JOIN DESIGNATION AS B USING (DEPT_ID) 
    WHERE B.DESIGNATION = "MANAGER" 

编辑: 如果你可以有多个管理员,您可以通过E_NAME使用具有明确的组GROUP_CONCAT聚合函数(假设这是一个唯一的密钥):

SELECT A.*, GROUP_CONCAT(B.E_NAME) 
    FROM DESIGNATION AS A, DESIGNATION AS B 
    WHERE B.DESIGNATION = "MANAGER" 
    AND A.DEPT_ID = B.DEPT_ID 
    GROUP BY(A.E_NAME) 
+0

我宁愿使用'JOIN DESIGNATION B USING(DEPT_ID)',因为这应该更好地使用索引。 –

+1

如果不止一位经理碰巧在指定栏里怎么办? – peterm

+0

@Kolink我_think_ SQL查询优化器“足够聪明”,可以用这两种语法生成完全相同的操作序列。但是,如果你愿意;) –

1

老派连接语法 - 对不起 - 但你的子查询没有太大意义。

Select d.ID, 
     d.DEPT_ID, 
     d.E_NAME, 
     d.DESIGNATION 
     m.MANAGER 
from designation d, 
     designation m 
where d.dept_id = m.dept_id 
and m.designation = 'MANAGER' 
+0

虽然我会使用'='而不是'LIKE'。 – Sam

+0

@sam我同意。虽然我不知道MySQL是否像“字符串不带通配符”那样优化为“= string” –

+0

同意 - 旧习惯很难实现... –

0

对于您运行的任何服务器端脚本,这看起来更好。例如,在PHP中,你可以这样做:

$managers = []; // array() before version 5.4 
$employees = []; // see above comment 
$query = "SELECT * FROM `DESIGNATION`"; 
$result = mysql_query($query); // adjust according to extension of choice 
while($row = mysql_fetch_assoc($result)) { // same as previous comment 
    $employees[] = $row; 
    if($row['DESIGNATION'] == "MANAGER") $managers[$row['DEPT_ID']] = $row['E_NAME']; 
} 
foreach($employees as $i=>$e) { 
    $employees[$i]['MANAGER'] = $managers[$e['DEPT_ID']] ?: "Nobody"; 
} 
0

一个简单连接会有帮助,我更喜​​欢一个明确的JOIN,而不是隐含逗号符号:

SELECT `ID`,`DEPT_ID`,`E_NAME`,`DESIGNATION`, m.e_name, AS `MANAGER` 
FROM `DESIGNATION` e 
INNER JOIN `DESIGNATION` m 
ON e.dept_id = m.dept_id 
WHERE m.designation = 'MANAGER' 
0

我们不能简单地这样做,以更简单的方式?

SELECT ID,DEPT_ID,ENAME,DESIGNATION, 
case 
when DEPT_ID=12 then 'B' 
when DEPT_ID=14 then 'D' 
end "MANAGER" 
from DESIGNATION 
+0

Ouch。正确但不是很有帮助的答案。 –

+0

为什么它没有帮助? – Ravi

+0

来吧。你真的想知道为什么这没有帮助吗?当您获得不符合(12,14)的DEPT_ID的条目时会发生什么?当您有数百个不同的DEPT_ID时,如何编写查询? –

0

请尝试以下

SELECT t.id 
     ,t.dept_id 
     ,t.e_name 
     ,t.designation 
     ,ta.e_name As Manager FROM Table1 t JOIN (SELECT e_name,dept_id 
      FROM Table1 WHERE designation = 'MANAGER' 
      GROUP BY dept_id,e_name) ta ON ta.dept_id = t.dept_id 

SQLFiddle Demo