Saya membuat kueri Gordon sedikit lebih sederhana. Sekarang benar-benar memenuhi kebutuhan Anda.
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 untuk mendapatkan daftar semua baris saja:
$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 untuk mendapatkan daftar bersarang dengan kueri 'rumit':
$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>';
Tetapi seperti yang Anda lihat, semakin banyak yang Anda coba lakukan dalam kueri Anda. Semakin banyak PHP yang dibutuhkan untuk menggunakannya dengan cara yang sederhana. Jadi, Anda perlu menemukan keseimbangan antara SQL dan PHP untuk mendapatkan kode terbaik. Saya biasanya tidak menggunakan pendekatan di atas, tetapi hanya melakukan beberapa kueri seperti ini:
PHP untuk mendapatkan daftar bersarang tanpa kueri 'rumit':
$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>';
Anda masih perlu memodifikasi kueri untuk kebutuhan Anda sendiri (nama tabel dan semacamnya).