2017-03-18 11 views
5

MySQLでPHPでWebアプリケーションを作成しています。私はテーブルの数を求めているし、これは、データがそのテーブルに格納されている方法です各曜日をカラムとして取得MySQLとPHP

 
Table: counts 

id counts location_id media_id created_at 
-------------------------------------------------- 
1  50   1    1  2017-03-15 
2  30   2    1  2017-03-15 
3  80   1    2  2017-03-15 
4  20   1    1  2017-03-16 
5  100  2    2  2017-03-16 

ごとにユニークなlocation_idの、media_idこのとのcreated_atのために、私は、カウントを格納します。

 
select sum(counts.count) as views, locations.name as locations, DAYNAME(counts.created_at) AS weekday from `counts` inner join `locations` on `locations`.`id` = `counts`.`location_id` where `counts`.`created_at` between '2016-12-04' and '2016-12-10' group by `weekday`, `counts`.`location_id`; 

これは、データが表示されている方法です:

 
Table: locations 

id  name 
---------------- 
1  Location 1 
2  Location 2 
3  Location 3 
4  Location 4 
5  Location 5 

これは私が現時点で持っているSQLクエリです:

私はこのようなものです別のテーブルの場所を持っている

 

locations  weekday  views 
----------------------------------- 
Location 1 Mon   50 
Location 1 Tue   30 
Location 2 Mon   20 
Location 2 Tue   70 

私はレポートを作成していますが、今週のすべての曜日が列に対応する値をその曜日のビュー数として表示します。私はこのようなものが欲しい:

 
locations  mon tue wed thu fri sat sun 
------------------------------------------------- 
Location 1 40 60 51 20 40 20 30 
Location 2 80 60 100 24 30 10 5 

これはMySQLで可能ですか、それを達成するためにPHPを使用する必要がありますか?もしそうなら、私はどうすればそれについて行きますか?

ありがとうございます、ありがとうございます。

注意:サンプルデータは正確ではありません。

+0

MySQLクエリはデータベースからデータを取得するのに役立ちますが、データ出力のフォーマットには役立ちません。 PHPは、通常、Webブラウザ用のHTML出力を作成するために使用されます。結論:データを取得して出力をフォーマットする必要があります。それを試してみて、それを動作させることができない場合は、コードを表示してください。 –

+0

それができない場合は、出力をフォーマットする必要があります。私はそれがMySQLで可能と考えました。 –

答えて

3

この結果は、条件付き集計を使用してMySQLで達成できます。

トリックは、SELECTリストの式で条件付きテストを使用して、countの値を返すかどうかを判断することです。

このような何か:

SELECT l.name             AS `locations` 
     , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Mon',c.count,0)) AS `mon` 
     , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Tue',c.count,0)) AS `tue` 
     , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Wed',c.count,0)) AS `wed` 
     , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Thu',c.count,0)) AS `thu` 
     , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Fri',c.count,0)) AS `fri` 
     , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Sat',c.count,0)) AS `sat` 
     , SUM(IF(DATE_FORMAT(c.created_at,'%a')='Sun',c.count,0)) AS `sun` 
    FROM `locations` l 
    LEFT 
    JOIN `counts` c 
    ON c.location_id = l.id 
    AND c.created_at >= '2016-12-04' 
    AND c.created_at < '2016-12-04' + INTERVAL 7 DAY 
    GROUP BY l.name 
    ORDER BY l.name 

注:

サンプルデータとは、location_id=1 and created_at='2016-03-15'ための2つの行が存在するので、このクエリは、(50 + 80 =)tue 130の合計を返します、50ではありません(既存のクエリのサンプル出力に示されているように)。

+0

ありがとうございました。これは完全に機能します。 –

関連する問題