Bạn có thể chạy truy vấn này:
SELECT c.id AS cid, c.slug AS cslug, c.name AS cname,
s.id AS sid, s.name AS sname
FROM categories AS c
LEFT JOIN snippets AS s ON s.category = c.id
WHERE c.live=1
ORDER BY c.name, s.name
Sau đó, lặp qua các kết quả để tạo tiêu đề thích hợp như:
// last category ID
$lastcid = 0;
while ($r = $navQuery->fetch_object ()) {
if ($r->cid != $lastcid) {
// new category
// let's close the last open category (if any)
if ($lastcid)
printf ('</li></ul>');
// save current category
$lastcid = $r->cid;
// display category
printf ('<li><a href="/%s">%s</a>', $r->cslug, $r->cname);
// display first snippet
printf ('<li><a href="/%s/%s">%s</a></li>', $r->cslug, $r->sname, $r->sname);
} else {
// category already processed, just display snippet
// display snippet
printf ('<li><a href="/%s/%s">%s</a></a>', $r->cslug, $r->sname, $r->sname);
}
}
// let's close the last open category (if any)
if ($lastcid)
printf ('</li></ul>');
Lưu ý rằng tôi đã sử dụng printf
nhưng bạn nên sử dụng hàm của riêng mình để thay thế hàm này bao quanh printf, nhưng chạy htmlspecialchars
thông qua các tham số (tất nhiên là ngoại trừ tham số đầu tiên).
Tuyên bố từ chối trách nhiệm:Tôi không nhất thiết khuyến khích việc sử dụng <ul>
như vậy s.
Đoạn mã này chỉ ở đây để hiển thị ý tưởng cơ bản về việc xử lý dữ liệu phân cấp có được với một truy vấn.