0

我将不胜感激 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 来做,我需要某种数组,因为以后我必须把一个图表放在一起。

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 年将被加在一起。

您也可以仅使用 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 month(date) AS month, COUNT(*) AS cnt
FROM database
GROUP BY month(date);

一个查询可以完成您的查询循环所做的所有事情,而且开销要少得多。

于 2012-10-31T14:02:20.903 回答
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,则您将按月份进行分组。这很好,因为它将年份和月份组合成一列,以便在必要时轻松排序、比较和连接。

于 2012-10-31T14:08:00.853 回答
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 回答