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

Laravel使用selectRaw构建查询时出现SQL语法错误求助

问题分析与解决方案

你的SQL语法错误根源在于:不能在聚合函数的字段定义中直接使用WHERE子句。WHERE是用来过滤整个查询的行数据,而要实现按条件统计聚合结果,需要使用条件聚合(结合CASE WHEN和聚合函数)。

修正后的代码

方式一:使用COUNT + CASE WHEN

$revs = DB::table('reviews')
    ->where('website_id', $website_id)
    ->selectRaw('
        COUNT(id) AS total_count,
        COUNT(CASE WHEN review_source_id != 1 THEN 1 END) AS third_party_reviews_count,
        COUNT(CASE WHEN review_source_id = 1 THEN 1 END) AS normal_reviews_count,
        COUNT(CASE WHEN stars = 1 THEN 1 END) AS total_1_star,
        COUNT(CASE WHEN stars = 2 THEN 1 END) AS total_2_star,
        COUNT(CASE WHEN stars = 3 THEN 1 END) AS total_3_star,
        COUNT(CASE WHEN stars = 4 THEN 1 END) AS total_4_star,
        COUNT(CASE WHEN stars = 5 THEN 1 END) AS total_5_star
    ')
    ->get();

方式二:使用SUM + CASE WHEN

$revs = DB::table('reviews')
    ->where('website_id', $website_id)
    ->selectRaw('
        COUNT(id) AS total_count,
        SUM(CASE WHEN review_source_id != 1 THEN 1 ELSE 0 END) AS third_party_reviews_count,
        SUM(CASE WHEN review_source_id = 1 THEN 1 ELSE 0 END) AS normal_reviews_count,
        SUM(CASE WHEN stars = 1 THEN 1 ELSE 0 END) AS total_1_star,
        SUM(CASE WHEN stars = 2 THEN 1 ELSE 0 END) AS total_2_star,
        SUM(CASE WHEN stars = 3 THEN 1 ELSE 0 END) AS total_3_star,
        SUM(CASE WHEN stars = 4 THEN 1 ELSE 0 END) AS total_4_star,
        SUM(CASE WHEN stars = 5 THEN 1 ELSE 0 END) AS total_5_star
    ')
    ->get();

原理说明

  • COUNT(CASE WHEN 条件 THEN 1 END):当条件满足时返回1(非NULL值),COUNT会统计这些非NULL的条目数;条件不满足时返回NULL,COUNT会忽略这些值。
  • SUM(CASE WHEN 条件 THEN 1 ELSE 0 END):当条件满足时累加1,不满足时累加0,最终结果就是符合条件的条目总数。两种方式效果完全一致,可根据习惯选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:35:16