感谢@LukasGeiter的帮助,我改进了我的报价和书籍数据库。 在第4次编辑后,我将我的问题简化为:
我现在能够列出某些类型的作家,并根据他们的重要性和“喜欢”和& '不喜欢'分配给给定的汽车
这是产生我的收藏的代码:
$targetted = Capacitytype::find($capacity); // this selects Sci-Fi writers only from among all writers
$rank_entities_by_capacity = Entity::join('entity_capacitytypes', function($q) use ($capacity){
$q->on('entity_capacitytypes.entity_id', '=', 'entities.id');
$q->where('entity_capacitytypes.capacitytype_id','=', $capacity);
})->leftJoin('user_attitudes', function($q) {
$q->on('user_attitudes.entity_id', '=', 'entities.id');
$q->where('item_type', '=', 'entity');
})
->selectRaw('entities.*, SUM(user_attitudes.importance) AS importance'
, SUM(user_attitudes.attitude) AS attitude'
)
->groupBy('entities.id')
->orderBy('importance', 'desc')
->take(6)
->get();
我需要什么:
1)我想按特定用户分配给每个列出作者的UPVOTES数量对列表进行排序
卢卡斯提供的代码完成了这项工作:
'SUM(IF(user_id = ' . Auth::user()->id . ', user_attitudes.attitude, 0)) AS karma_current_user'
现在我想要另一种排序方法:
每位作者都有一定数量的引语和出版的书籍。 用户可以UPVOTE和DOWNVOTE这些创作
表user_attitudes中的看起来像这样:
> id | item_id | item_type | entity_id | importance | attitude (VOTES) | creator_id
> 1 | 51 | entity | 51 | -1 |100
> 2 | 32 | book | 51 | -1 |100
> 3 | 33 | book | 51 | -1 |100
用简单的英语: - 实体51收到用户#100(lukas已经提供代码)的终身成就预算
要做的事: 我需要列出实体(在这种情况下是科幻作家),并按照分配给他们创作的书籍的这些DOWN-VOTES对列表进行排序。在上面的例子中,作者得分为“-2”。
为了将我的想法转化为StackOverflow模型,我现在可以将喜欢分配给帮助我的人(lukas在我的表中获得+1 UP-VOTE user_attitudes.attitude)。我还可以列出所有收到我喜欢的用户。这个完成了。 现在,我希望看到用户排名按照他们对我自己的问题提供的答案数量排序。 Lukas以c排名第一。 6个答案......等等。
可能我只需要在此行中添加额外的IF子句
'SUM(IF(user_id = ' . Auth::user()->id . ', user_attitudes.attitude, 0)) AS karma_for_books'
要添加的条件:
IF user_attitudes.item_type = book
IF user_attitudes.entity_id = (entity)....
IF attitude = '-1' // counting downwotes only
我不知道此任务的语法规则。
我们需要额外的左手加入吗? Aftrer两个DB结构的变化我很困惑。 这可能会有所帮助: Laravel 4 query builder - with complicated left joins
Laravel Eloquent and Multiple Joins
但它超出了我的范围......
任何帮助表示赞赏。谢谢。
THX
答案 0 :(得分:2)
在IF
内使用SUM()
应该有效。试试这个:
$selects = array(
// your existing selects
'SUM(IF(user_attitudes.attitude = -1, 1, 0)) AS dislikes',
'SUM(IF(user_attitudes.attitude = 1, 1, 0)) AS likes',
'SUM(IF(user_id = ' . Auth::user()->id . ', user_attitudes.attitude, 0)) AS karma_current_user'
);
答案 1 :(得分:0)
1)如果分数永远不会从-1,0或1改变,那么你可以做一个计数:
// Positive:
$positive = UserAttitude::where('importance', '>', 0)->count();
// Negative:
$negative = -1 * UserAttitude::where('importance', '<', 0)->count();
我假设一个名为UserAttitude的Laravel模型代表该表。如果需要,不应该很难适应更自定义的查询。
2)不太确定你在这里寻找什么,因为为这个特定查询添加另一个where子句不应该改变总数。