sql >> データベース >  >> RDS >> Mysql

PHP、MYSQLのネストされたクエリ

    Gordonsのクエリを少し簡単にしました。これで、要件を正確に満たします。

    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:

    $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:

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

    しかし、ご覧のとおり、クエリで実行しようとする回数は多くなります。より多くのPHPが簡単な方法でそれを使用する必要があります。したがって、最も優れたコードを取得するには、SQLとPHPのバランスを見つける必要があります。私は通常、上記のアプローチには行きませんが、次のような複数のクエリを実行するだけです:

    「複雑な」クエリなしでネストされたリストを取得するPHP:

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

    自分のニーズ(テーブル名など)に合わせてクエリを変更する必要があります。



    1. SQL Server(T-SQL)のdatetimeoffset値のタイムゾーンオフセットを変更する

    2. ノードMySQLは複数のクエリを可能な限り最速で実行します

    3. SQLフィドルとMySQLサーバー/PhpMyadminで異なる結果

    4. ユーザーに関連するカテゴリごとの値を取得するにはどうすればよいですか?