2016-09-17 72 views
0

我有2個表相互引用。第一個表是位置。MySQL組合列

id  title 
------ -------- 
001  a  
002  b  
003  c  
004  d  
005  e  

第二張表是單位。

id  status info   
------ ------ ------------ 
001  s  manager  
001  o  head manag 
002  s  programmer 
003  s  programmer 

in status field,'s'表示標題,'o'表示正文。 我嘗試用左運動,沒有運氣。

SELECT a.id, a.title, 
(CASE WHEN b.status = 's' THEN b.info END) AS header, 
(CASE WHEN b.status = 'o' THEN b.info END) AS body 
FROM 
POSITION a LEFT JOIN 
unit b 
ON a.id = b.id 

結果是

id  title header  body   
------ ------ ---------- ------------ 
001  a  manager  (NULL)  
001  a  (NULL)  head manag 
002  b  programmer (NULL)  
003  c  programmer (NULL)  

我不知道結果是提前這

id  title header  body   
------ ------ ---------- ------------ 
001  a  manager  head manag 
002  b  programmer (NULL)  
003  c  programmer (NULL) 

感謝等。

+0

如果標題'a'有另一個條目,那麼怎麼辦? –

回答

0

您需要GROUP BY ID。並且您需要狀態列的聚合函數(如MIN()MAX())。

SELECT a.id, a.title, 
MIN(CASE WHEN b.status = 's' THEN b.info END) AS header, 
MIN(CASE WHEN b.status = 'o' THEN b.info END) AS body 
FROM 
POSITION a LEFT JOIN 
unit b 
ON a.id = b.id 
GROUP BY a.id 

sqlfiddle

更新:

讓我們把你原來的結果,而不聚集,但如果你組的結果通過ID其只限制ID = 001

id  title header  body   
------ ------ ---------- ------------ 
001  a  manager  (NULL)  
001  a  (NULL)  head manag 

現在(GROUP BY a.id)但不使用任何聚合函數,MySQL可以自由選擇任何值* from c未在GROUP BY子句中列出的列。這不是title列**的問題,因爲它應該始終是相同的。但是對於headerbody列,MySQL可能會選擇NULL。我們使用MIN(...)告訴MySQL選擇非空的「最小」值(如果僅存在NULL值,則爲NULL)。不要緊,如果你使用MIN()MAX(),因爲應該只有一個非空值,結果將是相同的。

hedaer: 
    MIN('manager', NULL) = 'manager' 
    MAX('manager', NULL) = 'manager' 

body: 
    MIN(NULL, 'head manag') = 'head manag' 
    MAX(NULL, 'head manag') = 'head manag' 


*事實上,它會選擇第一個值。但這是一個實施問題,這種行爲在未來可能會改變。

**在嚴格模式下,您甚至不允許選擇title,因爲它未在GROUP BY子句中列出。因此,您需要使用聚合函數(MIN(a.title))或將其列在GROUP BY子句(GROUP BY a.id, a.title)中。

+0

超級,我甚至從來沒有使用min或max,當我不得不使用min和max時呢? –

+0

@immma - 檢查更新 –

+0

現在我明白了。即使你的解釋比mysql文檔更好。提前致謝。 –