2017-12-18 151 views
5

ile başka bir tabloda bir sütun üzerine dayalı on üst kategori seçme Üç tablo var: uploads, categories ve category_upload adlı bir many-to-many tablo. Elonelli

tablolar

şuna benzer:

**categories** 

id 
name 

**uploads** 

id 
name 
downloads(integer) 

**category_upload** 

id 
category_id 
upload_id 

indirip her zaman bir indirme sütunundaki değer Yapmak istediğim ne 1.

artarak, ancak "Yükle" could Nasıl başlayacağınızı öğrenmek, uploads tablosundaki downloads sütununa göre en iyi 10 kategoriyi seçmektir. Dolayısıyla, downloads sütununun toplamı, belirli bir kategorideki tüm yüklemeler için en büyük olanıysa, bu kategori bir numara ve on numara olacak şekilde olmalıdır.

Bu, basit veya sadece SQL ile nasıl yapılabilir? Herhangi bir ipucu takdir edilir!

Kategori:

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

yükle:

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

Numune verileri denemek ve istenen sonuçları gerçekten yardımcı olacaktır. Örneğin bir "kitap" nedir? –

+0

@GordonLinoff kitabı bir yükleme, onu düzelttim. –

cevap

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

Merhaba, cevabınız için teşekkürler. Bazı küçük tweaks ile çalıştı, ben değişti ne: İsim seçin, yükler Gönderen ( seçin c.name, SUM (downloads) olarak yüklenenler Gönderen uploader olarak u INNER kategori_upload ucunda uc.upload_id = u.id INNER kategorilerine katılmak üzere, c üzerinde c.id = uc.category_id Group by c.name) t Yüklüyor İndirme zamanlandı Limit 10 –

0

sizin Category modeli

İşte

Ben modellerinde benim ilişkileri kurdum nasıl Kumandanızda yılında

(Catagory)

bu

Category::select("*")->with(['downloads' => function($q){ 
    $q->oderBy('downloades','desc')->take(10)->get(); 
})