【问题标题】:Laravel 5.3 query - distinct results with sum of votesLaravel 5.3 查询 - 带有投票总和的不同结果
【发布时间】:2017-03-06 17:59:49
【问题描述】:

我遇到了一个棘手的问题,我想以雄辩的方式解决这个问题,但我认为我需要进入原始 sql,而这并不是我真正想要的。这是我目前所拥有的:

  1. 用户模型 - 用户可以有很多帖子 编号 |姓名

  2. 帖子 - 可以有多个类别 编号 |用户 ID |标题...等

  3. 技能 - 这是多对多关系的数据透视表(与帖子相关的技能类型) 编号 |技能类型 ID | post_id

  4. 技能类型 - 这是独特技能的列表。 编号 |蛞蝓 |标题 |等等。

  5. 投票 - 投票与技能表相关

标识 |技能ID

我需要做的是获得投票数排名前 10 的用户技能。 为此,我需要按名称合并技能并汇总投票数,然后按投票数排序并输出前 10 名。

可能今天我的大脑已经太累了,明天早上我会解决这个难题,但在我想出解决方案之前,也许其他人会帮助解决它。

我的解决方案:

public function getTopSkills($limit = 10, $offset = 0)
{

    $results = DB::select('select skill_types.name as name, count(likes.id) as  votes 
                        FROM 
                          skills
                        left join likes 
                        on skills.id=likes.likeable_id
                        join posts on skills.item_id = posts.id
                        join users on posts.user_id = users.id
                        join skill_types on skill_types.id = skills.skill_type_id
                        where users.id = :userid
                        group by skill_types.name 
                        order by votes desc
                        limit :limit
                        offset :offset', ['userid' => $this->id, 'limit' => $limit, 'offset' => $offset]);
    return $results;
}

【问题讨论】:

    标签: mysql laravel many-to-many


    【解决方案1】:

    幸运的是,SQL 比你想象的要容易

    SELECT skill_id, count(id) 
    FROM VOTES 
    group by skill_id
    

    然后您只需将 Skill_id 绑定回技能类型表即可获取名称而不是数字 ID

    【讨论】:

    • 感谢您的帮助。 SQL 非常简单,我同意,但主要障碍是找出最佳逻辑。您能否更详细地解释您的答案?我仍然被这部分难题所困扰。
    • 上面的 SQL 会给出一个带有技能 ID 和每个技能使用次数的结果集。您可以将此结果粘贴到一个数组中,对数组进行排序,然后返回前 10 个技能。
    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多