Ik heb Gordons vraag een beetje eenvoudiger gemaakt. Het voldoet nu precies aan uw eisen.
SELECT
`name`
FROM
(
(SELECT 'project' as `type`, `name`, `id` as `projectid` FROM `Project`)
UNION ALL
(SELECT 'todo' as `type`, `name`, `projectid` FROM `Todo`)
) as `combined`
ORDER BY
`project_id`, `type`
PHP om alleen een lijst van alle rijen te krijgen:
$q = $db->query("SELECT `name` FROM ((SELECT 'project' as `type`, `name`, `id` as `project_id` FROM `projects`) union all (SELECT 'todo' as `type`, `name`, `project_id` FROM `todos`)) as `combined` ORDER BY `project_id`, `type`");
while($row = $q->fetch_object()) {
echo $row->name . '<br />';
}
PHP om geneste lijsten te krijgen met een 'gecompliceerde' zoekopdracht:
$q = $db->query("SELECT `name`, `type` FROM ((SELECT 'project' as `type`, `name`, `id` as `project_id` FROM `projects`) union all (SELECT 'todo' as `type`, `name`, `project_id` FROM `todos`)) as `combined` ORDER BY `project_id`, `type`");
echo '<ul>';
$needToBeClosed = false;
while($row = $q->fetch_object()) {
if($row->type == 'project' AND $needToBeClosed) {
echo '</ul></li>';
$needToBeClosed = false;
}
echo '<li>' . $row->name;
if($row->type == 'project') {
echo '<ul>';
$needToBeClosed = true;
} else {
echo '</li>';
}
}
if($needToBeClosed) {
echo '</ul></li>';
}
echo '</ul>';
Maar zoals u kunt zien, hoe meer u probeert te doen in uw zoekopdracht. Hoe meer PHP er nodig is om het op een eenvoudige manier te gebruiken. Je moet dus een balans vinden tussen SQL en PHP om de mooiste code te krijgen. Ik zou normaal gesproken niet voor de bovenstaande benadering gaan, maar voer gewoon meerdere zoekopdrachten uit zoals deze:
PHP om een geneste lijst te krijgen zonder 'ingewikkelde' zoekopdrachten:
$projects = $db->query('SELECT * FROM `projects`');
echo '<ul>';
while($project = $projects->fetch_object()) {
echo '<li>' . $project->name . '<ul>';
$todos = $db->query('SELECT * FROM `todos` WHERE `project_id` = ' . $project->id);
while($todo = $todos->fetch_object()) {
echo '<li>' . $todo->name . '</li>';
}
echo '</ul></li>';
}
echo '</ul>';
U moet nog steeds de zoekopdrachten aanpassen voor uw eigen behoeften (tabelnamen en dergelijke).