【发布时间】:2022-01-20 01:58:27
【问题描述】:
我有下面的原始 sql 查询,它按预期工作
SELECT T1.category, T1.group, T1.series, T1.name, T2.cover
FROM (
SELECT category, MAX(COALESCE(image)) as cover
FROM stones
GROUP BY `category`
HAVING COUNT(DISTINCT category) = 1
) T2
INNER JOIN stones T1 on T2.category = T1.category;
在尝试将其转换为 Laravel Query Builder 语法时,我尝试了以下方法
DB::table('stones', 't1')
->select('t1.category', 't1.group', 't1.series', 't1.name', 't2.cover')
->from(DB::raw('(SELECT category, MAX(COALESCE(image)) as cover) FROM stones GROUP BY `category` HAVING COUNT(DISTINCT category)=1) t2'))
->join('stones as t2', 't2.category', '=', 't1.category')
->get();
报错
Illuminate\Database\QueryException with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM stones GROUP BY `category` HAVING COUNT(DISTINCT category)=1) t2 inner join' at line 1 (SQL: select `t1`.`category`, `t1`.`group`, `t1`.`series`, `t1`.`name`, `t2`.`cover` from (SELECT category, MAX(COALESCE(image)) as cover) FROM stones GROUP BY `category` HAVING COUNT(DISTINCT category)=1) t2 inner join `stones` as `t2` on `t2`.`category` = `t1`.`category`)'
当我尝试转储 toSql() 生成的 sql 时,我看不出与原始 sql 有任何区别,但是我无法发现错误。
# dump from toSql()
"select `t1`.`category`, `t1`.`group`, `t1`.`series`, `t1`.`name`, `t2`.`cover` from (SELECT category, MAX(COALESCE(image)) as cover) FROM stones GROUP BY `category` HAVING COUNT(DISTINCT category)=1) t2 inner join `stones` as `t2` on `t2`.`category` = `t1`.`category`"
【问题讨论】:
-
as cover) FROM中的)是否必要?因为我没有在您的第一个原始查询中看到它,但它在您的数据库查询构建器中 -
我认为您不应该将此查询与 eloquent 一起使用,只需使用
DB::statement("query");直接运行它即可 -
@Faesal 你能否详细说明如何使用
DB::statement('raw sql query here'),因为它只返回一个bool如何让语句执行? -
您的原始 sql 查询是否成功获得结果?
-
是的,它得到了想要的结果。正如@ChanYungKeat 和@adevel 所指出的,一旦我在
cover之后删除了额外的)并在join()中将stones as t2替换为stones as t1- 查询生成器语句也可以工作 - 已发布工作查询生成器语句以下供参考
标签: mysql laravel eloquent laravel-query-builder