Laravel:添加子查询的多个计数结果

时间:2019-08-02 04:15:32

标签: sql laravel-5 subquery laravel-query-builder

我想添加多个属于不同表的查询的计数结果。 我将以下问题用作实际问题的参考,因为该问题已经有解决方案(How do I add two count(*) results together on two different tables?),但是在laravel中实施该解决方案时遇到了问题。

我有两个桌子:玩具和游戏。

+--------------------+------------------+
| Field              | Type             |
+--------------------+------------------+
| toy_id             | int(10) unsigned |
| little_kid_id      | int(10) unsigned |
+--------------------+------------------+

+--------------------+------------------+
| Field              | Type             |
+--------------------+------------------+
| game_id            | int(10) unsigned |
| little_kid_id      | int(10) unsigned |
+--------------------+------------------+

一个小孩可以有多个玩具。一个小孩可以一次参加多个游戏。

我想要一个查询,该查询将为我提供little_kid涉及的玩具和游戏的总数。

基本上,我想要这两个查询的总和:

SELECT COUNT(*) FROM Toys WHERE little_kid_id = 900;
SELECT COUNT(*) from Games WHERE little_kid_id = 900 

以上问题具有以下公认的答案

SELECT
(SELECT COUNT(*) FROM Toys WHERE little_kid_id = 900)+
(SELECT COUNT(*) from Games WHERE little_kid_id = 900)
AS SumCount

我想在Laravel中实现上述解决方案。

我尝试了以下方法,但无济于事。它给出语法错误。

$sub=DB::tabel('toys')->select(DB::raw('count(*) as total'))
->where('little_kid_id',$id);

$sub1=DB::tabel('games')->select(DB::raw('count(*) as total'))
->where('little_kid_id',$id);

$result = DB::table( DB::raw("( ({$sub->toSql()})+({$sub1->toSql()}) )  as 
total_count") )
->mergeBindings($sub)
->mergeBindings($sub1)
->select('total_count.total')
->get();

我也尝试过这种方法。它可以工作,但是可以收集,但是我需要一个总计数的整数值

$result=$sub->unionAll($sub1);
dd($result->get());

简而言之,我想在laravel中执行该问题(How do I add two count(*) results together on two different tables?)的公认解决方案。

1 个答案:

答案 0 :(得分:0)

您可以使用这些代码:

$q = DB::tabel('toys')->select('toy_id','little_kid_id')->where('little_kid_id',900);

    $q1 = DB::tabel('games')->select('game_id','little_kid_id')->where('little_kid_id',900)

  $data = $q->union($q1)->count();

别忘了并集要求表必须具有相同的列,以便在您的列彼此不匹配的情况下选择列,请不要触摸select语句,否则请随意删除代码

第二种方法是:

DB::table(DB::raw('(SELECT COUNT(*) as c FROM Toys WHERE little_kid_id = 900) t,(SELECT COUNT(*) as c1 from Games WHERE
     

little_kid_id = 900)t2'))-> selectRaw('t.c + t2.c1 as   SumCount')-> toSql(); //如果要获取,请将toSql()更改为get()   数据而不是sql代码

您可以尝试一下。有关更多信息,请参见https://laravel.com/docs/5.8/queries#raw-expressions。如果要由任何用户获取请求参数,请进行确认以防止SQL注入