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

MySQL:配列を使用してJSONオブジェクトを作成するリクエスト

    LEFT JOINを使用して、必要なすべてのデータを取得できます。データを反復処理するときは、どのデータを処理するかを注意する必要があります。

    $lastArticleId = null;
    $comments = [];
    $elements = [];
    $sql = 'SELECT Articles.*, Comments.content AS comment, Comments.username FROM Articles LEFT JOIN Comments ON Articles.id = Comments.id_article';
    $result = $pdo->query($sql);
    foreach ($result->fetchAll(PDO::FETCH_OBJ) as $dataset) {
        if($lastArticleId !== $dataset->id){
            $lastArticleId = $dataset->id;
            $elements[$lastArticleId] = [
                'id'       => $dataset->id,
                'title'    => $dataset->title,
                'content'  => $dataset->content,
                'date'     => $dataset->date,
                'comments' => [],
            ];
        }
        $comments[$lastArticleId][] = [
            'content' => $dataset->comment,
            'username' => $dataset->username,
        ];
    }
    foreach ($elements as $key => $article) {
        $article['comments'] = $comments[$key];
        $fullData[] = $article;
    }
    echo json_encode($fullData);
    

    しかし :できるからといって、そうすべきだという意味ではありません。

    このタスクを2つのクエリに分割すると、書き込みと読み取りがはるかに簡単になります。したがって、後で何らかの理由でこのコード(または他の誰か)に触れる必要がある場合は、2クエリアプローチを選択して喜んでいただけます。

    また、タスクを分割することをお勧めします。そのため、理想的には、データベースアクセス層のgetAllArticles()にメソッドを作成します。 もう1つはgetCommentsByArticleId($id_article) 。このようにして、記事全体を読み込むことなく、すべてのコメントを取得できます。



    1. Oracle - ID の自動インクリメント一意キーを持つテーブルを作成するにはどうすればよいですか

    2. TOADでの実行のみを使用して複数のSQLステートメントを実行する

    3. 両方が同じスキーマを持っている場合、Mysqlで2つのデータベースを1つにマージできますか?

    4. com.zaxxer.hikari.pool.PoolInitializationException:プールの初期化中の例外