You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用MySQL或Laravel Eloquent查询仅含1条请求的客户?

嘿,这个需求我之前也碰到过,给你整理了两种靠谱的实现方式,分别对应原生MySQL和Laravel Eloquent,你可以根据自己的场景选择:

MySQL 原生查询实现

我们可以通过关联两张表,按客户维度分组后筛选出请求数恰好为1的记录,具体SQL语句如下:

SELECT c.Id, c.name
FROM clients c
INNER JOIN requests r ON c.Id = r.client_id
GROUP BY c.Id, c.name
HAVING COUNT(r.Id) = 1;

逻辑说明:

  • 用INNER JOIN关联clients和requests表,确保只保留有请求记录的客户(符合你“拥有1条请求”的前提)
  • GROUP BY c.Id, c.name按客户的唯一标识分组(避免重名客户导致统计错误)
  • HAVING COUNT(r.Id) = 1精准筛选出分组后请求记录数为1的客户
Laravel Eloquent 实现

在Laravel框架里,有两种简洁的实现方式,都能满足需求:

方式一:利用关联统计(推荐)

这种方式更贴合Eloquent的ORM风格,前提是你的Client模型已经定义了和Request的关联关系:

// app/Models/Client.php
public function requests()
{
    return $this->hasMany(Request::class, 'client_id');
}

然后就可以用withCount统计请求数,再通过having筛选:

$targetClients = Client::withCount('requests')
    ->having('requests_count', '=', 1)
    ->select('id', 'name')
    ->get();

方式二:模拟原生关联查询

如果更习惯用查询构造器的关联写法,也可以直接模拟原生SQL的逻辑:

$targetClients = Client::join('requests', 'clients.id', '=', 'requests.client_id')
    ->select('clients.id', 'clients.name')
    ->groupBy('clients.id', 'clients.name')
    ->havingRaw('COUNT(requests.id) = 1')
    ->get();

内容的提问来源于stack exchange,提问作者Abdullah Al_Nahhal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:07:34