我目前正在制作一个网站,该网站使用基于标准的评分系统以及其他注释。每个标准都有一个与之相关的分数,分数与产品一起显示。标准链接通过使用中间链接表的“标签云”完成。问题是,我希望能够选择符合某些标准的产品,但是当我尝试这样做时,它会改变产品分数 - 这就是问题所在。
我在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"
}
}
}
基本上,我想选择具有一定标准的产品,而不改变其分数。有什么想法可以解决这个问题?谢谢!