2016-12-21 116 views
1

在我的Laravel 5.3應用程序中,投票表具有淨投票欄。我希望根據網絡投票找到視頻的排名。我想展示如下列表中的排名。我知道sql @raw方法。但是,我想使用Laravel方法。因爲還有一些其他的表與這個用戶表結合在一起,還有一些其他的短接也需要完成。如何在laravel中獲得排名

視頻表:

id  | net_votes| video_id | 
------ | -------: |:-------: | 
1  | 5  | 1  | 
2  | 11 | 2  | 
3  | 3  | 1  |  
4  | 6  | 3  |  
5  | 5  | 2  |  

我想這樣

id  | net_votes| rank 
------ | -------: |:----: 
2  | 11 | 1 
4  | 6  | 2 
1  | 5  | 3 
5  | 5  | 4 
3  | 3  | 5 

結果現在我使用這個代碼。它的工作。但我想用Laravel雄辯方法。

$score_board_list = DB::select("SELECT *, total, @r:[email protected]+1 as rank, 
      @l:=total FROM (select username, first_name, video_title, 
      net_votes, sum(net_votes) as total from videos 
      LEFT JOIN users ON videos.user_id = users.id 
      LEFT JOIN profile ON users.id = profile.user_id 
      group by videos.id order by total desc, videos.created_at desc) totals, (SELECT @r:=0, @l:=NULL) rank"); 
+0

**根據網票用戶的排名** - >你可以按遞減順序進行訂購通過**網票** voila,你得到了你的第一名,第二等等。至少,給了我們一個你已經嘗試過的例子..還有**加入這個用戶表**非常有趣,如果你認爲它是至關重要的,也可以發佈它..儘可能詳細 –

+0

@BagusTesa我編輯了我的問題。謝謝。 –

+0

你的意思是你要使用laravel查詢生成器? – Beginner

回答

1

要做到這一點

存儲在您的子查詢到一個變量

$subquery = "( 
    SELECT username, 
       first_name, 
       video_title, 
       net_votes, 
       Sum(net_votes) AS total 
    FROM  videos 
    LEFT JOIN users 
    ON  videos.user_id = users.id 
    LEFT JOIN profile 
    ON  users.id = profile.user_id 
    GROUP BY videos.id 
    ORDER BY total DESC, 
       videos.created_at DESC) totals"; 

則相當於爲

Select * from (subquery) 

到雄辯是

DB::table(DB::raw('subquery')) 

然後選擇自定義列

// for example 
->select(DB::raw('@r:[email protected]+1 as rank')) 

所以,你的查詢生成器會是這樣

$subquery = "( 
    SELECT username, 
       first_name, 
       video_title, 
       net_votes, 
       Sum(net_votes) AS total 
    FROM  videos 
    LEFT JOIN users 
    ON  videos.user_id = users.id 
    LEFT JOIN profile 
    ON  users.id = profile.user_id 
    GROUP BY videos.id 
    ORDER BY total DESC, 
       videos.created_at DESC) totals"; 


$score_board_list = DB::table(DB::raw($subquery)) 
->select(
    '*', 
    'total', 
    DB::raw('@r:[email protected]+1 as rank'), 
    DB::raw('@l:=total')) 
->get();