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

Laravel/Eloquent:如何在单查询中按多条件统计条目数?

可以在单查询中完成多组条件的COUNT统计

当然可以,不需要多次执行查询,用条件聚合或者临时表关联就能实现需求,下面针对你的场景给出两种常用方案:

方案1:条件聚合(适合固定数量的统计条件)

利用CASE WHEN配合COUNT(或SUM),在单查询中同时计算多组条件的统计值。假设你的数据表名为your_table,字段包含points(如果需要针对指定id的记录统计,可额外增加id判断):

场景A:统计全表中points大于各阈值的条目数

SELECT
  COUNT(CASE WHEN points > 25.33 THEN 1 END) AS count_for_id_1,
  COUNT(CASE WHEN points > 83.11 THEN 1 END) AS count_for_id_55,
  COUNT(CASE WHEN points > 6.05 THEN 1 END) AS count_for_id_854
FROM your_table;

原理:CASE WHEN仅在条件满足时返回1,否则返回NULL;COUNT会自动忽略NULL值,最终得到对应条件的有效行数。

场景B:统计指定id下,points大于对应阈值的条目数

如果你的需求是针对数组中每个id,仅统计该id的记录里满足points>阈值的数量:

SELECT
  COUNT(CASE WHEN id = 1 AND points > 25.33 THEN 1 END) AS count_for_id_1,
  COUNT(CASE WHEN id = 55 AND points > 83.11 THEN 1 END) AS count_for_id_55,
  COUNT(CASE WHEN id = 854 AND points > 6.05 THEN 1 END) AS count_for_id_854
FROM your_table;

方案2:临时表关联(适合动态数量的统计条件)

如果你的$data数组是动态生成的(条目数量不固定),可以将数组数据转换为临时表,再与业务表关联统计,结果会按每个id分行返回,更灵活:

示例(以MySQL 8.0+/PostgreSQL为例)

SELECT
  t.id,
  COUNT(y.points) AS count_gt_threshold
FROM (
  -- 将你的$data数组转换成临时表数据
  VALUES
    (1, 25.33),
    (55, 83.11),
    (854, 6.05)
) AS t(id, threshold)
-- 关联业务表,匹配满足条件的记录
LEFT JOIN your_table y ON y.points > t.threshold
-- 如果是场景B,这里改为:LEFT JOIN your_table y ON y.id = t.id AND y.points > t.threshold
GROUP BY t.id;

返回结果示例:

idcount_gt_threshold
1120
5535
854450

这种方法的优势是无需修改查询结构,只要动态生成VALUES里的内容即可适配任意数量的统计条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:25:11