用符号替换数据库查询中多余的日期 (MySQL/PHP)

3

我有一个数据库查询,按时间顺序显示历史事件列表,如下所示:

(URL = MySite/Calendar/January_1)<br>
On this day in history...<br>
1968 - A volcano erupted.<br>
1968 - A country was invaded.<br>
1968 - Someone had a hit song.<br>
1970 - A famous person was born.

我想知道是否有一种方法可以只显示一次年份,以使显示看起来像这样:
1968 - A volcano erupted.<br>
&#8226; A country was invaded.<br>
&#8226; Someone had a hit song.<br>
1970 - A famous person was born.

让我们从一个数据库表(calendar_px)开始,它列出了各种历史政治事件的日期。 表格有五个字段- 1)N(一个简单的数字键) 2)URL(值 - 例如May_1 - 匹配页面URL) 3)Year(例如1970年,但是字段类型是INT,而不是Year,仅限于1901年以后) 4)Brief(一些简短的内容) 5)Date(字段类型将是date或datetime;我目前并没有使用此字段)
下面是我的代码(其中$ MyURL等于页面URL;例如January_1):
$stm = $pdo->prepare("SELECT Cal2.N, Cal2.URL, Cal2.Date, Cal2.Year, Cal2.Brief
 FROM calendar_px Cal2
 WHERE Cal2.URL = :MyURL
 ORDER BY Cal2.Year");
$stm->execute(array(
 'MyURL'=>$MyURL
));

while ($row = $stm->fetch())
{
 $Year = $row['Year'];
 $Brief[] = ''.$Year.' &#8211; '.$row['Brief'].'';
}

然后,我会像这样展示一个历史事件列表...
echo join( $Brief, '<br>' );

我认为这并没有改变任何事情,但是需要提及的是我在几个网站上都拥有类似的设置,除了表名称不同以外一切都一样:calendar_gw、calendar_gz、calendar_gs、calendar_px、calendar_sl。

因此,我使用UNION命令将所有五个表连接在一起。以下是查询的一部分:

$stm = $pdo->prepare("SELECT CGW.N, CGW.URL, CGW.Date, CGW.Year, CGW.Brief
 FROM calendar_gw CGW
 WHERE CGW.URL = :MyURL
 UNION ALL
 SELECT CGZ.N, CGZ.URL, CGZ.Date, CGZ.Year, CGZ.Brief
 FROM calendar_gz CGZ
 WHERE CGZ.URL = :MyURL
 UNION ALL
 SELECT CSL.N, CSL.URL, CSL.Date, CSL.Year, CSL.Brief
 FROM calendar_sl CSL
 WHERE CSL.URL = :MyURL
 ORDER BY Year");
$stm->execute(array(
'MyURL'=>$MyURL
));

无论如何,我的目标是相同的;用某种“鼎形字符”或符号替换冗余的日期(年份)。


1
使用一个变量来保存上一行的年份。每次循环时,检查当前年份是否与变量相同;如果是,则显示dingbat而不是年份。这不是微不足道的吗? - Barmar
对你来说这很简单;而我仍在试图弄清楚如何实现你建议的内容。也许我玩弄一段时间后就能明白了。 ;) - user2469520
2个回答

1
$prevYear = null;
while ($row = $stm->fetch())
{
    $Year = $row['Year'];
    if ($Year == $prevYear) {
        $YearStr = '&#8226; ';
    } else {
        $YearStr = $Year . ' $#8211; ';
        $prevYear = $Year;
    }
    $Brief[] = $YearStr.$row['Brief'];
}

P.S.您不需要在字符串的每一端连接''


那是另一种做法。++ - BlitZ

0

看起来你需要在输出之前对结果集进行分组:

$events = array();

while($row = $stm->fetch()){
    $year = $row['Year']; // current year

    if(!isset($events[$year]){   // if no such group
        $events[$year] = array();   // create group
    }

    $events[$year][] = $row['Brief']; // add data to year group
}

// Output:

foreach($events as $year => $event){
    echo $year, ':<br>'; // show year;

    foreach($event as $data){
        echo $data, '<br>';   // show row;
    }
}

另外,您可以轻松地将输出更改为您的模型:

foreach($events as $year => $event){
    echo $year, ' &#8226; ', implode('<br>&#8226; ', $event);
}

@DavidBlomstrom Barmar的更快。但我的可以更好地控制输出。如果需要在<ul>标签中换行,请选择任何一个答案作为解决方案,如果它们中的任何一个有帮助的话。干杯。 - BlitZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接