sql >> Database teknologi >  >> RDS >> Mysql

PHP, MYSQL indlejrede forespørgsler

Jeg gjorde Gordons forespørgsel en smule enklere. Det opfylder nu nøjagtigt dine krav.

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 for kun at få en liste over alle rækker:

$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 for at få indlejrede lister med 'kompliceret' forespørgsel:

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

Men som du kan se, jo mere prøver du at gøre i din forespørgsel. Jo mere PHP er nødvendigt for at bruge det på en enkel måde. Så du skal finde en balance mellem SQL og PHP for at få den pæneste kode. Jeg ville normalt ikke gå efter tilgangen ovenfor, men bare udføre flere forespørgsler som denne:

PHP for at få indlejret liste uden 'komplicerede' forespørgsler:

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

Du skal stadig ændre forespørgslerne til dine egne behov (tabelnavne og lignende).



  1. MySQL Tilføj unik begrænsning

  2. Hvordan udfyldes fremmednøgleværdier i en Hibernate + Spring JPA-konfiguration, når overordnede/underordnede objekter bevares på samme tid?

  3. Sådan deaktiveres og aktiveres alle begrænsninger i tabel mysql inkl. PK FK CHK UNI mm

  4. Vælg varer fra forskellige kilder, og bestil efter dato