0

php 配列に関するヘルプをいただければ幸いです。グラフを作成する必要がありますが、データベースから希望どおりに値を取得できないようです。したがって、基本的に必要なのは、特定の仕事の月あたりの時間です。データベースは次のようになります。

Date       |   Job   | Hours
2012-01-01 |  104    |   8.5

職種ごとに番号が違いますが、少しでも参考になれば幸いです。

1 つの仕事に費やした 1 か月あたりの時間の合計を取得する必要があります。これまでのところ、私は何ヶ月も配列を作成し、それらをループしてきました:

 $month_date_array = array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12');
 foreach ($month_date_array as $month) {
 $sql = "SELECT * FROM database WHERE date LIKE '%-$month-%'";
 $result = mysql_query($sql) or die (mysql_error());
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
      $job[] = $row['job'];
    }
}

オケイ、私はいくつかの変更を加えたので、質問を更新します。年は重要です。2011 と 2012 を一緒にグループ化することはできません。年はドロップダウン メニューから取得されます。ユーザーは何年かを選択します。次に、ジョブの配列を追加しました。すべてのジョブを取得することはできないことがわかったので、ジョブ配列は次のようになります。

$job = array('22', '6', '12', '55');

基本的に、誰かが月に 1 つの仕事に費やした時間の合計を取得する方法を知りたいです。後でグラフを作成する必要があるため、何らかの配列が必要です。

4

5 に答える 5

3

配列を操作してこれを行う方法を学びたい場合:

<?php
$jobs = array();
$month_date_array = array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12');
foreach ($month_date_array as $month) {
    $sql = "SELECT * FROM database WHERE date LIKE '%-$month-%'";
    $result = mysql_query($sql) or die (mysql_error());
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
        $jobs[$row['job']][$month] += $row['hours'];
    }
}

しかし、これは実際にはすべての年を一緒にグループ化することになることを知っておいてください. つまり、2011 年 11 月、2012 年、2013 年 11 月の日付が存在する場合は、それらが加算されます。

このグループ化と追加を SQL のみで行うこともできます。

http://sqlfiddle.com/#!2/416d9/5/0

# Group by Month and Year
SELECT YEAR(`Date`) as `Year`, MONTH(`Date`) AS `Month`, `Job`, SUM(`Hours`)
FROM `your_table`
GROUP BY `Year`, `Month`, `Job`

またはhttp://sqlfiddle.com/#!2/416d9/6/0

# Group by Month combining the Years
SELECT MONTH(`Date`) AS `Month`, `Job`, SUM(`Hours`)
FROM `your_table`
GROUP BY `Month`, `Job`
于 2012-10-31T14:06:51.727 に答える
1

他の年と同じ月にグループ化されているため、他のほとんどの回答には同意しません。このようなものの方が効率的です。

SELECT CAST(DATE_FORMAT(`Date`, '%Y-%m-01') AS DATE) month, SUM(`Hours`) hours
FROM `your_table`
WHERE `Job` = 104
GROUP BY month

http://sqlfiddle.com/#!2/8cf63/1

この手法は、日付を月の最初の日に「丸め」ます。したがって、これらの日付でグループ化すると、月ごとにグループ化されます。これは、年と月を1つの列にまとめて、必要に応じて簡単に並べ替え、比較、結合できるので便利です。

于 2012-10-31T14:08:00.853 に答える
1

あなたが持つことができたとき、かなり非効率的です

SELECT month(date) AS month, COUNT(*) AS cnt
FROM database
GROUP BY month(date);

クエリ ループが実行するすべてのことを 1 つのクエリで実行でき、オーバーヘッドがはるかに少なくなります。

于 2012-10-31T14:02:20.903 に答える
0

次のようなSQLクエリを実行する必要があります。

$sql = "SELECT * FROM database WHERE MONTH(date) = '".$month."'";
 $result = mysql_query($sql) or die (mysql_error());

    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
      $job[] = $row['job'];
    }
于 2012-10-31T14:02:22.383 に答える
0

以下のクエリはどうですか。

SELECT SUM(hours) FROM database 
WHERE DATE_FORMAT(date,'%m' ) = $month
GROUP BY  DATE_FORMAT(date,'%m' );
于 2012-10-31T14:04:47.130 に答える