Tôi đã thực hiện truy vấn Gordons đơn giản hơn một chút. Nó hiện đáp ứng chính xác yêu cầu của bạn.
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 để chỉ lấy danh sách tất cả các hàng:
$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 để nhận danh sách lồng nhau với truy vấn 'phức tạp':
$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>';
Nhưng như bạn có thể thấy, bạn càng cố gắng thực hiện nhiều hơn trong truy vấn của mình. Càng cần nhiều PHP để sử dụng nó một cách đơn giản. Vì vậy, bạn cần tìm sự cân bằng giữa SQL và PHP để có được mã đẹp nhất. Thông thường tôi sẽ không thực hiện phương pháp trên mà chỉ thực hiện nhiều truy vấn như sau:
PHP để nhận danh sách lồng nhau mà không có các truy vấn 'phức tạp':
$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>';
Bạn vẫn cần sửa đổi các truy vấn cho nhu cầu của riêng mình (tên bảng, v.v.).