2016-09-17 61 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文档更好。提前致谢。 –