我想在这里做一些相对简单的事情。基本上我有一个表格,里面有一堆标有时间戳的行(格式:2009-05-30 00:14:57)。
我想要的是一个查询,它会拉出所有行,并按月分割它们,所以我留下了最终结果,如:
二月
rowID名称订单日期
rowID名称订单日期
rowID名称订单日期
一月
rowID名称订单日期
rowID名称订单日期
rowID名称订单日期
等
我有一些模糊的想法如何做到这一点 - 他们似乎只是啰嗦。
其中一种方法是每个月进行一次查询。我将得到当前月份在PHP中的内容然后构造一个for(),它可以追溯到几个月。
像:
$currentmonth = 8;
$last6months = $currentmonth - 6;
for($i = $currentmonth; $i == $last6months; $i--) {
$sql = 'SELECT * FROM reports WHERE MONTH(reports.when) = $currentmonth ';
$res = mysql_query($sql);
// something would go here to convert the month numeral into a month name $currentmonthname
echo $currentmonthname;
while($row = mysql_fetch_array($res)) {
// print out the rows for this month here
}
}
有更好的方法吗?
答案 0 :(得分:5)
最好一次获取所有数据,按月排序..
然后在使用php获取时,您可以将当前月份存储在变量中(例如$ curMonth),如果月份有变化,则回显“新月”......
执行查询的速度很慢,最好尽量减少与db的“对话”..
答案 1 :(得分:3)
不要忘记,你必须处理多年。如果你有两个记录,一个是09年1月,一个是08年1月,你的结果可能会有偏差。
最好遵循Svetlozar的建议并立即获取所有数据。一旦你在内存中使用它,使用PHP将其分割成有用的东西:
$monthData = array();
$queryResult = mysql_query("
SELECT
*,
DATE_FORMAT('%m-%Y', when) AS monthID
FROM
reports
WHERE
YEAR(when) = 2009 AND
MONTH(when) BETWEEN 5 and 11
");
while ($row = mysql_fetch_assoc($queryResult))
{
if (!isset($monthData[$row['monthID']]))
$monthData[$row['monthID']] = array();
$monthData[$row['monthID']][] = $row;
}
mysql_free_result($queryResult);
foreach($monthData as $monthID => $rows)
{
echo '<h2>Data for ', $monthID, '</h2>';
echo '<ul>';
foreach($rows as $row)
{
echo '<li>', $row['someColumn'], '</li>';
}
echo '</ul>';
}
答案 2 :(得分:1)
您可以更改SQL查询以获取整个报告。这比循环查询数据库更有效。
select monthname(reports.when) as currentmonth, other, fields, go, here from reports order by reports.when asc
然后,您可以使用此循环创建嵌套报告:
var $currentMonth = ''; while($row = mysql_fetch_array($res)) { if($currentMonth !== $row['currentMonth']) { $currentMonth = $row['currentMonth']); echo('Month: ' . $currentMonth); } //Display report detail for month here }
*注意:未经测试,但你肯定会得到它的一般要点。
答案 3 :(得分:1)
这是SQL脚本:
SELECT*, DATE_FORMAT(fieldname,'%Y-%m') AS report FROM bukukecil_soval WHERE MONTH(fieldname) = 11 AND YEAR(fieldname)=2011
我希望你知道应该把这段代码放在哪里:D