2015-11-12 73 views
4

是否有可能在laravel查詢中使用COALESCE。COALESCE在laravel

$multipleitems = DB::table('votes') 
         ->select('masterItemId',DB::raw('sum(votes) as voteSum')) 
         ->whereBetween('voteDate',array($startDate,$endDate)) 
         ->where($condition) 
         ->groupBy('masterItemId') 
         ->get(); 

這是我的代碼,我想要得到每個項目和它的總票數。如果沒有投票,我想得到'0'。

但在上面的代碼返回具有ATLEAST 1票項目。 有沒有什麼方法可以在laravel中完成這個任務?

+0

是否投票表保持用戶可投票的實際投票數或每個項目的總數? – Shadow

+0

其實票表包含以下字段 - 「ID, 用戶id, masterItemId, 票, voteDate,」 - 。 所提交的投票包含1或-1。我想獲得每個項目的總票數。 – radiis

+0

所以你還想'masterItemsId'也沒有投票呢? 「投票」表中沒有條目? – Bogdan

回答

3

好了,OP沒有太大的幫助,但我會給它一個鏡頭!我假設,votes表包含用戶對這些項目投出的實際選票。這意味着,如果一個項目沒有獲得任何投票,則該項目ID(masterItemId)不會在votes表中存在。

這意味着,投票表亦留下加入了對主要項目表上masterItemId場。我會打電話的主要項目表:items,並假定它具有的masterItemId字段中votes表匹配的itemId場。在SQL方面:

select items.itemId, ifnull(sum(votes.votes),0) as votesSum 
from items left join votes on items.itemId=votes.masterItemId 
where votes.voteDate between ... and ... and <other conditions> 
group by items.itemId 

我不熟悉Laravel,但你需要這樣的事情,但是不要把是複製粘貼代碼:

$multipleitems = DB::table('items') 
       ->leftJoin('votes','items.itemId','=','votes.masterItemId') 
       ->select('items.itemId',DB::raw('ifnull(sum(votes.votes),0) as voteSum')) 
         ->whereBetween('votes.voteDate',array($startDate,$endDate)) 
         ->where($condition) 
         ->groupBy('items.temId') 
         ->get(); 
+0

希望這個答案會幫助我。但我只是想知道在laravel.i中使用MySQL COALESCE的任何範圍在我的另一個查詢中有這個函數的很多用途。謝謝你的答案。 – radiis

+0

您可以使用coalesce()而不是ifnull()。 – Shadow