2016-09-17 6 views
0

お互いを参照する2つのテーブルがあります。最初のテーブルは位置です。MySQL結合列

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

であり、第2のテーブルは単位である。

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

ステータスフィールドの '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  head manag 
002  b  programmer (NULL)  
003  c  programmer (NULL) 

おかげのようなものであるだろう

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

です。

+0

タイトル「a」に別のエントリがある場合はどうなりますか? –

答えて

0

IDはGROUP BYにする必要があります。また、ステータス列には集計関数(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は任意の値を自由に選択できます* c GROUP BY句には列挙されていない欄があります。 title列**の問題ではありません。常に同じである必要があります。しかし、headerbodyカラムの場合、MySQLはNULLを選択することがあります。 MIN(...)を使用して、MySQLに、NULLでない「最小の」値(NULLの「値」のみが存在する場合はNULL)を選択するように指示します。 MIN()またはMAX()を使用するかどうかは関係ありません。なぜなら、1つのヌル値でなければならず、結果は同じになるからです。

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

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


*実際には、それが第1の値を選択します。しかし、それは実装の問題であり、この動作は将来変更される可能性があります。

**厳密モードでは、titleを選択することさえできません。なぜなら、GROUP BY句にはリストされていないからです。したがって、集計関数(MIN(a.title))を使用するか、GROUP BY句(GROUP BY a.id, a.title)にリストする必要があります。

+0

スーパー、私はminやmaxを使用することはありません。実際にminとmaxを使用する必要がありますか? –

+0

@immma - アップデート –

+0

を確認しました。あなたの説明は、mysqlのドキュメントよりも優れています。前もって感謝します。 –