首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PHP按周分组和显示MySQL条目

问使用PHP按周分组和显示MySQL条目
EN

Stack Overflow用户
提问于 2010-01-10 11:06:25
回答 3查看 7.4K关注 0票数 0

我正在建立一个网站与几个‘一行’。这些是使用存储在MySQL 5数据库中的简单PHP5表单添加的。每一行都有一个'id‘(auto_increment)、'title’、'description‘、'status’(1或0)和'date_added‘(MySQL日期时间)。

我想按月和年显示它们,如下所示:

代码语言:javascript
复制
<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片段,它表面上按月对行进行分组,但是查询只返回几个结果,而不是整个表:

代码语言:javascript
复制
SELECT `title`, `description`, `date_added`
FROM one_liners WHERE `status`=1 GROUP BY MONTH(date_added)

我该如何对它们进行分组,然后像上面那样循环显示呢?

任何帮助都将不胜感激。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-10 11:20:37

您不想为此使用GROUP BY子句。虽然它“听起来”像你想要的,但它有着完全不同的含义。

运行普通查询:

代码语言:javascript
复制
SELECT `title`, `description`, `date_added` FROM one_liners 
WHERE `status`= 1 ORDER BY `date_added`

然后循环结果,如下所示:

代码语言:javascript
复制
$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> &mdash;' . htmlentities( $row['description'] ) . '</dd>';
}
echo '</dl>';

我特别选择只使用一个dl,因为一个dl应该包含许多dd和dt元素,而不仅仅是每个列表一对元素。如果您不同意,请随时根据需要调整我的代码:)

票数 2
EN

Stack Overflow用户

发布于 2010-01-10 11:19:25

我认为你只需要用PHP来做这件事。SQL中的Group-by通常用于SUM、AVG、MAX、MIN、COUNT等。它不会对实际记录集做任何操作来显示您可以在PHP中访问的某种分组。

在这种情况下,我所做的是在循环中跟踪一个变量,以了解我何时进入新的组。对于您的SQL,您将这样做:

代码语言:javascript
复制
SELECT `title`, `description`, `date_added`
FROM one_liners WHERE `status`=1 ORDER BY MONTH date_added DESC

然后,在PHP中,您将执行以下操作:

代码语言:javascript
复制
$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月”格式或您想要的任何格式。

票数 1
EN

Stack Overflow用户

发布于 2010-01-10 11:21:34

如果您不想在那里使用GROUP BY,请尝试使用ORDER BY。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2035938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档