Du kan køre denne forespørgsel:
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
Gentag derefter resultaterne for at skabe den rigtige overskrift som:
// 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>');
Bemærk, at jeg brugte printf
men du bør bruge din egen funktion i stedet, som omslutter printf, men kører htmlspecialchars
gennem parametrene (undtagen den første selvfølgelig).
Ansvarsfraskrivelse:Jeg opfordrer ikke nødvendigvis til sådan brug af s.
Denne kode er kun her for at vise den grundlæggende idé om at behandle hierarkiske data, der er opnået med én forespørgsel.