count()
搭配 group by
語法,例如:
SELECT COUNT(*), `計數欄位` FROM `資料表` GROUP BY `欲計數欄位`
left()
的用法,也就是只擷取左邊 4 個數字(年度部份)
SELECT LEFT(`日期欄位`, 4) AS Y, COUNT(*) FROM `資料表` GROUP BY Y
或
SELECT YEAR(`日期欄位`) AS Y, COUNT(*) FROM `資料表` GROUP BY Y
function.php
,將函式放裡面(順便將 dd()
也移過去):
<?php
// 年度文章數
function year_count()
{
global $pdo;
try {
$stmt = $pdo->prepare("SELECT YEAR(date) AS Y, COUNT(*) FROM news GROUP BY Y ORDER BY Y DESC");
$stmt->execute();
$year_count = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
} catch (PDOException $e) {
die("取得年度文章數失敗:" . $e->getMessage());
}
return $year_count;
}
利用 COUNT()
搭配 GROUP BY
語法將「年度」及「文章數」都抓出來,並用 YEAR()
來取得日期欄位的年份,並用 AS
命名別名 Y
(因為後面都會用到)
重點在於用fetchAll()
讀出時,指定了 PDO::FETCH_KEY_PAIR
參數,也就是將取得的兩個值,一個當索引,一個當值,的放入陣列中,更好完全符合我們的需求。
header.php
,引入 function.php
:
<?php
require_once 'config.php';
require_once 'vendor/autoload.php';
require_once 'function.php';
index.php
及 admin.php
,執行函式並將其值丟到樣板
$smarty->assign('op', $op);
$smarty->assign('categories', $categories);
$smarty->assign('year_count', year_count());
$smarty->display('index.tpl');
templates/index_side.tpl
<div class="list-group">
{foreach $year_count as $year => $counter}
<a href="index.php?year={$year}" class="list-group-item list-group-item-action d-flex justify-content-between align-items-center {if (isset($smarty.get.year) && $smarty.get.year == $year) || (!isset($smarty.get.year) && $smarty.now|date_format:'%Y' == $year)}active{/if}">
{$year}
<span class="badge bg-success badge-pill">{$counter}</span>
</a>
{/foreach}
</div>
$year_count
用 foreach()
依序取出,並拆分為將年度 {$year}
及數量 {$counter}
<ul><li></li></div>
結構,因為想要用連結,故改為 <div><a></a></div>
結構,如此可以方便加入連結 index.php?year={$year}
告知 index.php
要取出 year
為某一年的文章資料$year
參數時可以用 $smarty.get.year
取得,若是和迴圈讀到的的年度一致,就加入 active
,使之變成藍底白字。$year
參數時,就改用 $smarty.now|date_format:'%Y'
取得現在的年份,若是和迴圈讀到的的年度一致,也加入 active
。最後看起來像這樣: