Laravel中的MySQL子查询,如何加入查询并将第二个查询的结果作为新列添加到第一个查询?

Posted

技术标签:

【中文标题】Laravel中的MySQL子查询,如何加入查询并将第二个查询的结果作为新列添加到第一个查询?【英文标题】:MySQL sub query in Laravel, how to join queries and add second query's result as a new column to first query? 【发布时间】:2017-02-09 02:31:19 【问题描述】:

我有两张桌子:

- PRODUCTS (having: ID, NAME, PRICE)
- LIKES (having: ID, PRODID, NAME)

我想查询第一个表,同时在子查询中计算(并作为新列返回)产品的所有喜欢。如何组合以下查询?

$products = DB::table('PRODUCTS')
                  ->get();

$likes = DB::table('LIKES')
                  ->select(DB::raw('count(*) as total'))
                  ->where('PRODID', '=', 'product id from first table')
                  ->get();

如何使用 Laravel 查询来实现这一点? 谢谢!

【问题讨论】:

不要将其作为子查询,将 2 个表连接在一起,并根据产品表中的字段进行分组。 我试过了,但是 LIKES 表有多行具有相同的 PRODID,所以当我加入这两个行时,行将不匹配。该查询将在我的 PRODUCTS 表中创建重复行。 这就是你使用 group by 的原因。我可以给你sql中的解决方案,但是你需要翻译成laravel,因为我不知道。 谢谢,我试试这个方法。 【参考方案1】:

不是您特别要求的答案,但作为替代方案,使用 Eloquent 将非常容易处理。

$products = Product::with('likes');
foreach ($products as $product) 
    echo 'Number of likes: '.$product->likes->count();

【讨论】:

【参考方案2】:

使用带有 group by 子句的连接,而不是子查询。这样您就可以一次获得所有产品的计数,您不必逐个查询计数。 sql如下:

select p.id, p.name, p.price, count(l.id) as likecount
from products p
left join likes l on p.id=l.prodid
group by p.id, p.name, p.price

【讨论】:

【参考方案3】:

这样试试

$likes = DB::table('LIKES')
      ->join('PRODUCTS', 'LIKES.PRODID', '=', 'PRODUCTS.id') 
      ->select('LIKES.*') 
      ->where('PRODUCTS.id', '=', 3)      
      ->get();
$total_like = count($likes); 

【讨论】:

以上是关于Laravel中的MySQL子查询,如何加入查询并将第二个查询的结果作为新列添加到第一个查询?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 6,MYSQL - 如何使用 Laravel Querybuilder 或 Model Eloquent 将子查询与 GroupBY 左连接?

如何在 Laravel-5 中构建子查询 [重复]

如何在 Laravel 8 中使用 PostgreSQL 中的子查询通过 group by 子句获取行值?

MySQL 中的 While 循环使用连接和子查询选择数据

慢查询分组,加入MYSQL laravel

如何在laravel中的子查询中求和