我正在建立一个网站与几个‘一行’。这些是使用存储在MySQL 5数据库中的简单PHP5表单添加的。每一行都有一个'id‘(auto_increment)、'title’、'description‘、'status’(1或0)和'date_added‘(MySQL日期时间)。
我想按月和年显示它们,如下所示:
<dl>
<dt>August 2009</dt>
<dd><strong>title 1</strong> - description 1</dd>
<dd><strong>title 2</strong> - description 2</dd>
<dd><strong>title 3</strong> - description 3</dd>
etc...
</dl>
<dl>
<dt>July 2009</dt>
<dd><strong>title 1</strong> - description 1</dd>
<dd><strong>title 2</strong> - description 2</dd>
<dd><strong>title 3</strong> - description 3</dd>
etc...
</dl>我发现了一个MySQL片段,它表面上按月对行进行分组,但是查询只返回几个结果,而不是整个表:
SELECT `title`, `description`, `date_added`
FROM one_liners WHERE `status`=1 GROUP BY MONTH(date_added)我该如何对它们进行分组,然后像上面那样循环显示呢?
任何帮助都将不胜感激。
谢谢!
发布于 2010-01-10 11:20:37
您不想为此使用GROUP BY子句。虽然它“听起来”像你想要的,但它有着完全不同的含义。
运行普通查询:
SELECT `title`, `description`, `date_added` FROM one_liners
WHERE `status`= 1 ORDER BY `date_added`然后循环结果,如下所示:
$query = 'SELECT `title`, `description`, `date_added` FROM one_liners WHERE `status`= 1 ORDER BY `date_added`';
$res = mysql_query( $query );
$month = null;
$year = null;
echo '<dl>';
while($row = mysql_fetch_assoc( $res ){
$r_month = strtotime( $row['date_added'] );
if($month != date('m', $r_month) || $year != date('Y', $r_month)){
echo '<dt>' . date('F Y', $r_month) . '</dt>';
$month = date('m', $r_month);
$year = date('Y', $r_month);
}
echo '<dd><strong>' . htmlentities( $row['title'] ) . '</strong> —' . htmlentities( $row['description'] ) . '</dd>';
}
echo '</dl>';我特别选择只使用一个dl,因为一个dl应该包含许多dd和dt元素,而不仅仅是每个列表一对元素。如果您不同意,请随时根据需要调整我的代码:)
发布于 2010-01-10 11:19:25
我认为你只需要用PHP来做这件事。SQL中的Group-by通常用于SUM、AVG、MAX、MIN、COUNT等。它不会对实际记录集做任何操作来显示您可以在PHP中访问的某种分组。
在这种情况下,我所做的是在循环中跟踪一个变量,以了解我何时进入新的组。对于您的SQL,您将这样做:
SELECT `title`, `description`, `date_added`
FROM one_liners WHERE `status`=1 ORDER BY MONTH date_added DESC然后,在PHP中,您将执行以下操作:
$prevMonth = '';
while ($row = mysql_fetch_assoc($result)) {
$currMonth = $row['date_added'];
if ($currMonth != $prevMonth) {
if ($prevMonth != '') {
echo '</dl>';
}
echo '<dl><dt>' . $currMonth . '</dt>';
$prevMonth = $currMonth;
}
echo '<dd><strong>' . $row['title'] . '</strong>';
echo ' - ' . $row['description'] . '</dd>';
}
if (mysql_num_rows($result) > 0) {
echo '</dl>';
}所有这些实际上都是在循环时跟踪前一行中的月份。当你进入一个新的DL时,它会关闭旧的DL并打开一个新的DL。
根据您在数据库中存储日期的方式(时间戳和日期时间),您需要用适当的代码替换$currMonth = $row['date_added'];,以将其转换为“2009年8月”格式或您想要的任何格式。
发布于 2010-01-10 11:21:34
如果您不想在那里使用GROUP BY,请尝试使用ORDER BY。
https://stackoverflow.com/questions/2035938
复制相似问题