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

Laravel 5.1でこれ(左結合、サブクエリ)を書く方法は?

    Laravelのクエリビルダーでサブクエリを使用するには、次のようにサブクエリを結合に追加する必要があります:

    ->leftJoin(DB::raw("(SELECT [...]) AS p"), 'p.post_id', '=', 'posts.id')
    

    生のクエリで行ったように、計算フィールドのエイリアスを作成することもお勧めします:

    COUNT(*) AS count
    

    この変更にもかかわらず、私が間違っていない限り、クエリを単純にすることから始めることができます。この方法でサブクエリを削除します:

    SELECT
      p.id,
      p.title,
      p.created_at,
      p.updated_at,
      u.name,
      COUNT(c.id) AS comments_count,
      COALESCE(SUM(pl.status), 0) AS status_sum
    FROM
      posts p
    LEFT OUTER JOIN
      users u
    ON 
      u.id = p.user_id
    LEFT OUTER JOIN 
      postslikes pl
    ON 
      pl.post_id = p.id
    LEFT OUTER JOIN 
      comments c
    ON 
      c.post_id = p.id 
    ORDER BY 
      comments_count DESC
    GROUP BY
      p.id
    

    次に、この新しいクエリを使用して、Laravelを使用してビルドできます:

    DB::table('posts')
      ->select([
        'posts.id',
        'posts.title',
        'posts.created_at',
        'posts.updated_at',
        'users.name',
        DB::raw('COUNT(comments.id) AS comments_count'),
        DB::raw('COALESCE(SUM(postslikes.status), 0) AS status_sum'),
      ])
      ->leftJoin('users', 'users.id', '=', 'posts.user_id')
      ->leftJoin('comments', 'comments.post_id', '=', 'posts.id')
      ->leftJoin('postslikes', 'postslikes.post_id', '=', 'posts.id')
      ->orderBy('comments_count', 'DESC')
      ->groupBy('posts.id')
      ->get();
    

    idという名前の列があると想定していることに注意してください commentsで 主キーであるテーブル。




    1. PHPなしでmysqlの電子メールから名前を削除することは可能ですか?

    2. 列xxxxのデフォルトを、PostgresDBでブール型に自動的にキャストすることはできません

    3. MySQL-LIKEを使用して完全一致の単語を検索する方法は?

    4. PHP、MySQL、PDOトランザクション-tryブロック内のコードはcommit()で停止しますか?