2013-06-27 63 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