2017-12-18 127 views
5

Tôi có ba bảng: uploads, categories và một bảng many-to-many được gọi là category_upload.Chọn mười danh mục hàng đầu dựa trên một cột trong một bảng khác với hùng hồn

Các bảng trông như thế này:

**categories** 

id 
name 

**uploads** 

id 
name 
downloads(integer) 

**category_upload** 

id 
category_id 
upload_id 

Mỗi lần tôi tải về một "Tải lên" giá trị trong cột tải được tăng 1.

Những gì tôi muốn làm, nhưng không thể tìm hiểu cách bắt đầu là chọn 10 danh mục hàng đầu dựa trên cột downloads trong bảng uploads. Do đó, nếu tổng số cột là downloads là lớn nhất đối với tất cả các video tải lên từ một danh mục nhất định, danh mục này phải là số một và tiếp tục là số mười.

Điều này có thể đạt được bằng tài hùng biện hay chỉ là SQL và cách thực hiện? Bất kỳ lời khuyên được đánh giá cao!

Dưới đây là cách tôi đã thiết lập các mối quan hệ của tôi trong các mô hình:

Thể loại:

public function uploads(){ 
     return $this->belongsToMany('App\Upload'); 
    } 

Tải lên:

public function category(){ 
    return $this->belongsToMany('App\Category'); 
} 
+0

dữ liệu mẫu và kết quả mong muốn thực sự sẽ giúp đỡ. Ví dụ: "sách" là gì? –

+0

@GordonLinoff cuốn sách là một tải lên, tôi đã sửa nó. –

Trả lời

1
Select category_id, uploads 
From (
    Select category_id, SUM(downloads) as uploads 
    From uploads as u 
    Left join upload_category as uc on uc.id=u.upload_id 
    Left join category as c on c.id=uc.category_id 
    Group by category_id )as t 
    Order by uploads desc 
    Limit 10 
+0

Xin chào, cảm ơn câu trả lời. Nó hoạt động với một số chỉnh sửa nhỏ, đây là những gì tôi đã thay đổi: Chọn tên, tải lên Từ ( Chọn c.name, SUM (tải xuống) dưới dạng video tải lên Từ video tải lên dưới dạng u INNER join category_upload as uc on uc.upload_id = u.id INNER tham gia các danh mục dưới dạng c trên c.id = uc.category_id Nhóm theo c.name) dưới dạng t Đặt hàng bằng video tải lên desc Giới hạn 10 –

0

mô hình Category bạn

public function downloads() 
{ 
    return $this->hasMany('App\Upload','category_upload','category_id','upload_id'); 
} 

Trong điều khiển của bạn (Catagory)

thử này

Category::select("*")->with(['downloads' => function($q){ 
    $q->oderBy('downloades','desc')->take(10)->get(); 
}) 
Các vấn đề liên quan