私は現在、基準に基づく採点システムと追加のメモを使用するサイトを作成しています。各基準にはスコアが関連付けられており、スコアは製品とともに表示されます。条件のリンクは、中間リンク テーブルを使用して「タグ クラウド」を介して行われます。問題は、特定の基準を満たす製品を選択できるようにしたいのですが、これを行おうとすると製品スコアが変わってしまうことです。これが問題です。
Laravel のクエリ ビルダーで次のコードを使用しています。ただし、これは単なる MySQL の問題であるため、必要に応じてプレーン SQL で回答できます。
$products = DB::table('products')->
select('products.name', 'products.scored', 'products.slug', DB::raw('(SUM(`hex_criteria`.`score`) + SUM(DISTINCT(`hex_additionalnotes`.`score`))) as score'))->
leftjoin('criteria_linkings', 'products.id', '=', 'criteria_linkings.product_id')->
leftjoin('criteria', 'criteria_linkings.criteria_id', '=', 'criteria.id')->
leftjoin('additionalnotes', 'additionalnotes.product_id', '=', 'products.id');
if (Input::get('criteria')) {
$products->where(function($query) {
$crits = explode('-', Input::get('criteria'));
$query->where('criteria.id', '=', $crits[0]);
for ($i = 1; $i < count($crits); $i++) {
$query->orWhere('criteria_id', '=', $crits[$i]);
}
});
}
$products = $products->
orderBy('scored', 'DESC')->
orderBy($arr[0], $arr[1])->
groupBy('products.id')->
paginate(12);
以下は生成されたクエリです。
array(1) {
[0]=>
array(3) {
["query"]=>
string(550) "select `hex_products`.`name`, `hex_products`.`scored`, `hex_products`.`slug`, (SUM(`hex_criteria`.`score`) + SUM(DISTINCT(`hex_additionalnotes`.`score`))) as score
from `hex_products`
left join `hex_criteria_linkings` on `hex_products`.`id` = `hex_criteria_linkings`.`product_id`
left join `hex_criteria` on `hex_criteria_linkings`.`criteria_id` = `hex_criteria`.`id` left join `hex_additionalnotes` on `hex_additionalnotes`.`product_id` = `hex_products`.`id` where (`hex_criteria`.`id` = ? or `criteria_id` = ?)
group by `hex_products`.`id`
order by `scored` DESC, `score` asc"
["bindings"]=>
array(2) {
[0]=>
string(2) "18"
[1]=>
string(2) "13"
}
}
}
基本的には、スコアを変えずに一定の基準を持った商品を選びたいと思っています。この問題を解決するためのアイデアはありますか? ありがとう!