Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak to napisać (left join, subquery ) w Laravel 5.1?

Aby używać podzapytań z konstruktorem zapytań Laravela, należy dodać go do złączenia w następujący sposób:

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

Lepiej jest również utworzyć alias dla pól obliczeniowych, tak jak w przypadku surowego zapytania:

COUNT(*) AS count

Pomimo tych zmian, o ile się nie mylę, możesz zacząć od uproszczenia zapytania. Usuń podzapytania w ten sposób:

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

Następnie, za pomocą tego nowego zapytania, możesz użyć Laravela do jego zbudowania:

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

Zwróć uwagę, że zakładam, że masz kolumnę o nazwie id w Twoich comments tabela, która jest kluczem podstawowym.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie SQL do usunięcia bazy danych w MySQL

  2. MySQL DISTINCT na GROUP_CONCAT()

  3. polecenie systemowe mysql

  4. Mysql wyodrębnia pierwszą literę każdego słowa w określonej kolumnie

  5. Jak sprawić, by Django działało z nieobsługiwanymi sterownikami MySQL, takimi jak gevent-mysql lub sterownik MySQL firmy Concurrence?