2016-06-21 8 views
0

私は次のようなMySQLテーブルを持っています:id、date、複数のintフィールドは0/1です。各行に1つのintフィールドのみが1つあり、それ以外の列はすべて0になります。日付はidごとに繰り返すことができます。mysqlは最小の日付を取得し、グループとカラムを結合します。

id  | date   | isX | isY | isZ 
-------+--------------+-----+-----+----- 
111111 | '1994-04-09' | 0 | 1 | 0 
222222 | '1991-07-29' | 1 | 0 | 0 
222222 | '1991-07-29' | 0 | 1 | 0 
333333 | '1993-06-29' | 0 | 0 | 1 
333333 | '1993-06-29' | 0 | 1 | 0 
333333 | '1996-04-09' | 0 | 1 | 0 

私はどんなことidと行と日付が1(それ以外の場合は0)を持っている場合は最も早い日付と、各int列内の1で、各idのための単一の行を取得したいです。

id  | date   | isX | isY | isZ 
-------+--------------+-----+-----+----- 
111111 | '1994-04-09' | 0 | 1 | 0 
222222 | '1991-07-29' | 1 | 1 | 0 
333333 | '1993-06-29' | 0 | 1 | 1 

私はint

select id, 
    if(sum(isX)>0,1,0) as isX, 
    if(sum(isY)>0,1,0) as isY, 
    if(sum(isZ)>0,1,0) as isZ 
from table group by id; 

を結合するには、次のコマンドを使用していたが、私は最小の日付と行のみを使用する方法がわからなかったし、どのように出力に日付を追加します。

答えて

1

は、あなたが行 dateにidの分(日付)ではありません各IDの行をしたくなかった場合だけで、あなたは副問合せをする必要があります min(date)

select id, 
    min(`date`) as mindate, 
    if(sum(isX)>0,1,0) as isX, 
    if(sum(isY)>0,1,0) as isY, 
    if(sum(isZ)>0,1,0) as isZ 
from table 
group by id; 

を追加し、そこにいました

select id, 
    `date` 
    if(sum(isX)>0,1,0) as isX, 
    if(sum(isY)>0,1,0) as isY, 
    if(sum(isZ)>0,1,0) as isZ 
from table 
    INNER JOIN (SELECT id, min(date) as mindate FROM table GROUP BY id) sub1 ON 
     table.id = sub1.id AND 
     table.`date` = sub1.`date` 
group by id, `date`; 

は今if(sum(isx...ロジックはdateidためmin(date)で、レコードに対して使用されます。

関連する問題