我有一个数据库查询,按时间顺序显示历史事件列表,如下所示:
(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>
• A country was invaded.<br>
• 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.' – '.$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
));
无论如何,我的目标是相同的;用某种“鼎形字符”或符号替换冗余的日期(年份)。