資料表 group 依 conf_id 分組,需顯示每組的第一筆與最後一筆記錄(按 time 排序)。
<?php
$dsn = "mysql:host=localhost;dbname=group";
$db = new PDO($dsn, 'root', '');
$db->exec('SET NAMES utf8');
// 取得所有不重複的 conf_id
$sql = "SELECT conf_id FROM `group` GROUP BY conf_id";
$pre = $db->query($sql);
$result_arr = $pre->fetchAll(PDO::FETCH_ASSOC);
foreach ($result_arr as $v) {
$conf_id = $v['conf_id'];
echo $conf_id . "<br>";
// 正序取第一筆
$sql1 = "SELECT * FROM `group` WHERE conf_id = :cid ORDER BY time LIMIT 1";
// 倒序取最後一筆
$sql2 = "SELECT * FROM `group` WHERE conf_id = :cid ORDER BY time DESC LIMIT 1";
$stmt1 = $db->prepare($sql1);
$stmt1->execute([':cid' => $conf_id]);
$first = $stmt1->fetch(PDO::FETCH_ASSOC);
$stmt2 = $db->prepare($sql2);
$stmt2->execute([':cid' => $conf_id]);
$last = $stmt2->fetch(PDO::FETCH_ASSOC);
print_r($first);
print_r($last);
}
?>
LIMIT 1 避免撈取整組資料,大幅降低記憶體佔用conf_id 與 time 上建立複合索引 INDEX idx_conf_time (conf_id, time)WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY conf_id ORDER BY time) AS rn_asc,
ROW_NUMBER() OVER (PARTITION BY conf_id ORDER BY time DESC) AS rn_desc
FROM `group`
)
SELECT * FROM ranked WHERE rn_asc = 1 OR rn_desc = 1;