如何用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
相关产品推荐
相关产品推荐

