2017-02-05 8 views
0

次の3日間の最高温度(t0、t1、t2でのtemphi)をリゾート(res_id)に返すこのクエリがあります。私はリゾートごとに1列に予測をしたいと考えています(複数リゾートの場合)。どうやってやるの?mysqlグループの単一テーブル行への結果

ここだけのmysqlヒント

res_id lud    temphi 
1  2017-02-05  -5 
1  2017-02-06  -2 
1  2017-02-07  -8 
4  2017-02-05  2 
4  2017-02-06  1 
4  2017-02-07  -1 

望ましい結果

res_id  t0  t1  t2 
1   -5  -2  -8 
4   2  1  -1 




$rQuery1 = "SELECT a.lud, a.temphi,a.res_id 
FROM sv_snowalert a 
LEFT JOIN sv_orte b ON a.res_id = b.res_id AND b.ski_id>0 
INNER JOIN sv_canton c ON b.can_id = c.can_id 
INNER JOIN sv_country d ON c.cou_id = d.cou_id 
WHERE a.lud>='2017-02-05' GROUP BY a.res_id, a.lud ORDER BY a.res_id, a.lud ASC"; 
$rResult1 = mysql_query($rQuery1); 

$seq=0; 
$num_rows = mysql_num_rows($rResult1) 
while ($rows1 = mysql_fetch_array($rResult1)) 
{ 
$seq++; 
// output 

} 
+0

これは典型的なテーブルピボットの問題です。もし 'lud'がこれらの3つ以上の日付を持っていたら?それとも、この3つの日付が必要ですか? – Blank

+1

あなたは必要なものすべてを持っています。ループを開始します。 res_idが変更されるたびに新しい行を開始し、そうでない場合は新しい列を開始します。これは決定的にピボット問題ではありません。これはフォーマット上の問題で、PHPで最もよく処理されます。 – Strawberry

+1

ああ。 PHPの廃止予定のmysql_ APIの使用をやめてください。 – Strawberry

答えて

1

クエリ結果:

select 
    a.res_id, 
    max(case when date(a.lud) = date_add(curdate(), interval 0 day) then temphi else null end) as t0, 
    max(case when date(a.lud) = date_add(curdate(), interval 1 day) then temphi else null end) as t1, 
    max(case when date(a.lud) = date_add(curdate(), interval 2 day) then temphi else null end) as t2 
from sv_snowalert a 
left join sv_orte b on a.res_id = b.res_id and b.ski_id > 0 
inner join sv_canton c on b.can_id = c.can_id 
inner join sv_country d on c.cou_id = d.cou_id 
where a.lud between curdate() and date_add(curdate(), interval 2 day) 
group by a.res_id 
order by a.res_id asc 

、ここdemo

+0

そこにもtemploがあります。 max(case ...)行を再作成する必要がありますか、それとも既存の行に組み込むことはできますか? – mark

+0

「a templo」とはどういう意味ですか? – Blank

+0

最低温度 – mark

関連する問題