Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để viết điều này (kết nối trái, truy vấn con) trong Laravel 5.1?

Để sử dụng truy vấn con với trình tạo truy vấn của Laravel, bạn nên thêm nó vào tham gia như sau:

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

Tốt hơn là bạn nên tạo bí danh cho các trường được tính toán, như bạn đã làm trong truy vấn thô của mình:

COUNT(*) AS count

Bất chấp những thay đổi này, trừ khi tôi sai, bạn có thể bắt đầu bằng cách làm cho truy vấn của mình đơn giản hơn. Bỏ truy vấn con theo cách này:

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

Sau đó, với truy vấn mới này, bạn có thể sử dụng Laravel để xây dựng nó:

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

Lưu ý rằng tôi giả sử bạn có một cột có tên id trong comments bảng là khóa chính.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các tùy chọn chọn nguồn cấp dữ liệu từ DB tùy thuộc vào các tùy chọn chọn khác

  2. LOAD DATA INFILE không hoạt động

  3. đơn giản hóa:mysqli num_rows không hoạt động

  4. Opencart 2.2.0 cho phép tìm kiếm theo nhà sản xuất

  5. com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:trong mysql