显示每个月的数据

时间:2011-01-17 21:56:24

标签: php mysql

我有一张40行左右的表 - 这是一个小样本:

ID Date         Name      apples
1   1284497100    Brian     2
2   1288126800    Tom       5
3   1290268800    Kirsten   3
4   1292274000    Emma      7
5   1294174800    Sophie    1
6   1299012300    Lars      3

这些日期分布在一年左右,我希望有一个PHP页面向我展示每个月最多苹果的两个人:

1月:
名1
名称2

2月:
名1
名称2

我想知道是否有一种简单的方法可以做到这一点,或者我是否必须为每个月创建12个不同的mysql代码(我认为它会对服务器产生影响 - 我是对的吗?)

1 个答案:

答案 0 :(得分:2)

最简单的方法:

SELECT
  EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME(`Date`)) AS year_mo,
  `Name` AS name,
  SUM(`Apples`) AS sum_apples
FROM apples_table
GROUP BY 1,2
ORDER BY 1,3 DESC;

您可能应该使用DATETIME列来存储日期,但您可以使用FROM_UNIXTIME()函数将值转换为EXTRACT。有关详细信息,请参阅MySQL date/time functions documentation

此查询将为您提供每月两行以上的行,您将在PHP循环中处理该行,该循环通过跟踪您在同一个月看到的连续次数并根据需要丢弃行来读取结果。我认为这是处理问题的一种比使用12个单独查询更好的方法。

表中只有40行,除非你做的事情非常糟糕,否则性能不会成为问题。

如果您真的想深入研究在一个查询中准确返回所需结果所需的神秘SQL语法,请查看this article。处理关系和其他边缘情况将是这样的混乱。


编辑 - 这是PHP代码的想法:

$query = mysql_query(<<<SQL
  SELECT
    EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME(`Date`)) AS year_mo,
    `Name` AS name,
    SUM(`Apples`) AS sum_apples
  FROM apples_table
  GROUP BY 1,2
  ORDER BY 1,3 DESC;
SQL
) or die(mysql_error());

$last_year_mo = '';
$same_date_count = 0;
while ($row = mysql_fetch_assoc($query)) {
  # Only process 2 rows for each date
  if ($row['year_mo'] == $last_year_mo) {
    if (++$same_date_count >= 2) {
      continue;
    }
  } else {
    $last_year_mo = $row['year_mo'];
    $same_date_count = 0;
    # Spit out some HTML if needed, like a separator
  }

  # year_mo is a string in the form YYYYMM
  $year = substr($row['year_mo'], 0, 4);
  $month = date('F', mktime(0, 0, 0, substr($row['year_mo'], 4, 2), 1));

  # Spit out some HTML for this row
}