Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP, MYSQL verschachtelte Abfragen

Ich habe Gordons Abfrage etwas vereinfacht. Es entspricht jetzt genau Ihren Anforderungen.

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, um nur eine Liste aller Zeilen zu erhalten:

$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, um verschachtelte Listen mit 'komplizierter' Abfrage zu erhalten:

$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>';

Aber wie Sie sehen können, desto mehr versuchen Sie in Ihrer Abfrage zu tun. Je mehr PHP benötigt wird, um es auf einfache Weise zu verwenden. Sie müssen also ein Gleichgewicht zwischen SQL und PHP finden, um den besten Code zu erhalten. Ich würde normalerweise nicht den obigen Ansatz wählen, sondern einfach mehrere Abfragen wie diese durchführen:

PHP, um eine verschachtelte Liste ohne "komplizierte" Abfragen zu erhalten:

$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>';

Sie müssen die Abfragen noch an Ihre eigenen Bedürfnisse anpassen (Tabellennamen und dergleichen).