PHP数组 - 获得某些工作的每月小时数

时间:2012-10-31 13:57:53

标签: php arrays

我很感激php数组的一些帮助。我需要创建一个图形,但我似乎无法按照我希望的方式从数据库中获取值。 基本上我需要的是每月工作时间。 数据库看起来像这样:

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

每个工作都有不同的编号,但我希望这会有所帮助。

我需要得到每个月花在一份工作上的小时数。 到目前为止,我已经制作了几个月的数组并通过它们循环:

 $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'];
    }
}

Okei,我做了一些更改,我将更新我的问题: 这一年很重要,它不能将2011年和2012年组合在一起。这一年来自下拉菜单 - 用户选择哪一年。 接下来我添加了一系列作业,因为我只是发现我无法完成所有工作,因此作业数组看起来像这样:

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

基本上我想知道如何获得每个人每月花在一份工作上的时间总和。而且我不想用SQL做它,我需要某种类型的数组,因为后来我必须把图形放在一起。

5 个答案:

答案 0 :(得分: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年将加在一起。

您也可以执行此分组并仅添加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`

答案 1 :(得分:1)

相当低效,何时可以

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

单个查询执行查询循环正在执行的所有操作,并且开销要少得多。

答案 2 :(得分: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

此技术会将您的日期“舍入”到该月的第一天;因此,如果您在这些日期进行GROUP,那么您将按月分组。这很好,因为它将年份和月份组合成一列,以便于分类,比较和加入,如有必要。

答案 3 :(得分: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'];
    }

答案 4 :(得分:0)

以下查询如何:

SELECT SUM(hours) FROM database 
WHERE DATE_FORMAT(date,'%m' ) = $month
GROUP BY  DATE_FORMAT(date,'%m' );