我想优化我的项目中的查询,在多次尝试使用数据表的热切加载后,我放弃了,因为根本没有减少查询。
无论如何,现在我正试图使用join
来实现这一点,但问题是在DB::RAW
中使用WHERE
子句会给我带来以下错误:
"Exception Message:nnSQLSTATE[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 'WHERE reviews.na_ja in ja, count(reviews.category_id) WHERE...
我的代码是这样的:
$categories = DB::table('categories')
->join('reviews', 'reviews.category_id', '=', 'categories.id')
->select([
'categories.id',
'categories.slug',
'categories.title',
'categories.status',
'categories.created_at',
DB::raw('count(reviews.category_id) AS all_reviews'),
DB::raw('count(reviews.category_id) WHERE reviews.yes_no = yes AS all_yes_reviews'),
DB::raw('count(reviews.category_id) WHERE reviews.yes_no = na AS all_no_reviews'),
])
->where('categories.deleted_at', '=', NULL)
->groupBy(['reviews.category_id', 'categories.title']);
return DataTables::of($categories)
->addColumn('action', function ($category) {
return view('admin/categories/category_actions', compact('category'));
})->make(true);
我尝试了很多建议,但都没有奏效。有人能告诉我们如何使用join
来实现这一点吗?
编辑:更改顺序,将WHERE
置于GROUP BY
之前,错误仍然存在。错误出现在DB::raw
的上
按照stackoverflow现在的传统,我必须回答自己的问题。(在6个问题中,我在5号回答了自己……我将在未来创下纪录或获得徽章(
无论如何,在我尝试了许多方法来解决我想要实现的目标后,我决定使用数据库的"去规范化"。我在categories
表上添加了3列,分别是total_review
、total_yes
和total_no
,并使用BD::raw
进行了如下计算:
$categories = DB::table('categories')
->select([
'categories.*',
DB::raw('round((total_yes/total_reviews)*100) as yes_percentage'),
DB::raw('round((total_no/total_reviews)*100) as no_percentage'),
])
->where('categories.deleted_at', '=', NULL);
这是使用数据库"去规范化"的一个很好的例子,但这种方法只能在像这样的特定情况下使用。