sql >> Databáze >  >> RDS >> Mysql

PHP, MYSQL vnořené dotazy

Gordonův dotaz jsem trochu zjednodušil. Nyní přesně splňuje vaše požadavky.

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, chcete-li získat pouze seznam všech řádků:

$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 pro získání vnořených seznamů se „složitým“ dotazem:

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

Ale jak vidíte, tím více se ve svém dotazu snažíte udělat. Čím více PHP je potřeba používat jednoduchým způsobem. Takže musíte najít rovnováhu mezi SQL a PHP, abyste získali ten nejhezčí kód. Normálně bych nešel na výše uvedený přístup, ale pouze provedl několik dotazů, jako je tento:

PHP pro získání vnořeného seznamu bez „komplikovaných“ dotazů:

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

Ještě musíte upravit dotazy pro své vlastní potřeby (názvy tabulek a podobně).



  1. Jak zdravý je váš SQL Server? Proaktivní monitorování databáze je kritické

  2. Vložit s nativním dotazem Hibernate nefunguje pro java.util.Date

  3. ověřte věk před registrací uživatele a zkontrolujte, zda překročil určitý věk pomocí mvc

  4. vytvořit vlastní funkci pro rozdíl v datech s výjimkou víkendů a svátků v Oracle SQL