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

Jak to napsat (levý spoj, poddotaz) v Laravelu 5.1?

Chcete-li použít dílčí dotazy s Laravelovým tvůrcem dotazů, měli byste jej přidat do spojení následovně:

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

Je také lepší vytvořit alias pro počítaná pole, jako jste to udělali v nezpracovaném dotazu:

COUNT(*) AS count

Navzdory těmto změnám, pokud se nemýlím, můžete začít tím, že svůj dotaz zjednodušíte. Zrušte poddotazy tímto způsobem:

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

Pak s tímto novým dotazem můžete použít Laravel k jeho sestavení:

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();

Všimněte si, že předpokládám, že máte sloupec s názvem id ve vašich comments tabulka, která je primárním klíčem.




  1. Zobrazit výsledky MySQL podle data

  2. Zrušte nebo vytvořte databázi z uložené procedury v PostgreSQL

  3. Android:Hromadné vkládání, když je podpora InsertHelper ukončena

  4. mysql-connector python operátor 'IN' uložený jako seznam