Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用百分比计算结果获得选票_Mysql_Laravel 5_Eloquent - Fatal编程技术网

Mysql 如何使用百分比计算结果获得选票

Mysql 如何使用百分比计算结果获得选票,mysql,laravel-5,eloquent,Mysql,Laravel 5,Eloquent,在我的Laravel 5.7/mysql 5应用程序中,我有一个带有投票结果的表格: `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `vote_item_id` INT(10) UNSIGNED NOT NULL, `user_id` INT(10) UNSIGNED NOT NULL, `is_correct` TINYINT(1) NOT NULL DEFAULT '0', `created_at` TIMESTAMP NOT NULL DEF

在我的Laravel 5.7/mysql 5应用程序中,我有一个带有投票结果的表格:

`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`vote_item_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NOT NULL,
`is_correct` TINYINT(1) NOT NULL DEFAULT '0',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
其中boolean is_correct字段表示答案是否正确。 我需要得到正确答案百分比的数据

创建这样的请求

$voteItemUsersResultsCorrect = VoteItemUsersResult::    // Grouped by vote name
getByIsCorrect(true)->
getByCreatedAt($filter_voted_at_from, ' > ')->
getByCreatedAt($filter_voted_at_till, ' <= ')->
getByUserId($filterSelectedUsers)->
getByVote($filterSelectedVotes)->
getByVoteCategories($filterSelectedVoteCategories)->
getByVoteIsQuiz(true)->
getByVoteStatus('A')->
select( \DB::raw('count(vote_item_users_result.id) as count, votes.id, votes.name as vote_name') )->
orderBy('vote_name', 'asc')->
groupBy( 'votes.id' )->
groupBy( 'vote_name' )->
join(\DB::raw('vote_items'), \DB::raw('vote_items.id'), '=', \DB::raw('vote_item_users_result.vote_item_id'))->
join(\DB::raw('votes '), \DB::raw('votes.id'), '=', \DB::raw('vote_items.vote_id'))->
get();
$voteItemUsersResultsRect=VoteItemUsersResult:://按投票名分组
getByIsCorrect(真)->
getByCreatedAt($filter\u voted\u at\u from,'>')->

getByCreatedAt($filter_voated_at_till,一个正确的原始MySQL将使用条件聚合:

SELECT
    v.id,
    100.0 * COUNT(CASE WHEN vir.is_correct = 1 THEN 1 END) / COUNT(*) AS pct_correct,
    100.0 * COUNT(CASE WHEN vir.is_correct = 0 THEN 1 END) / COUNT(*) AS pct_incorrect
FROM votes v
INNER JOIN vote_items vi
    ON v.id = vi.vote_id
INNER JOIN vote_item_users_result vir
    ON vi.id = vir.vote_item_id 
WHERE
    vir.created_at  > '2018-08-01' AND vir.created_at  < '2018-09-23' AND
    v.is_quiz = '1' AND
    v.status = 'A'
GROUP BY
    v.id;
选择
v、 身份证,
100.0*计数(如果病毒正确=1,则为1结束)/计数(*)为pct正确,
100.0*计数(如果病毒正确=0,则1结束)/计数(*)为pct不正确
来自投票
内部联接表决单元第六项
在v.id=vi.vote\u id上
内部联接投票\项目\用户\结果病毒
ON vi.id=vir.vote\u item\u id
哪里
在“2018-08-01”和“2018-09-23”创建的病毒
v、 is_测验='1'和
v、 状态='A'
分组
v、 身份证;
现在,我们可以尝试为此编写Laravel代码:

DB::table('vote')
    ->select('vote.id',
             DB::raw('100.0 * COUNT(CASE WHEN vir.is_correct = 1 THEN 1 END) / COUNT(*) AS pct_correct'),
             DB::raw('100.0 * COUNT(CASE WHEN vir.is_correct = 0 THEN 1 END) / COUNT(*) AS pct_incorrect'))
    ->join('vote_items', 'votes.id', '=', 'vote_items.vote_id')
    ->join('vote_item_users_result', 'vote_items.id', '=', 'vote_item_users_result.vote_item_id ')
    ->where([
        ['vote_item_users_result.created_at', '>', '2018-08-01'],
        ['vote_item_users_result.created_at', '<', '2018-09-23'],
        ['vote.is_quiz', '=', '1'],
        ['vote.status', '=', 'A']
    ])
    ->groupBy('vote.id')
    ->get();
DB::table('vote')
->选择('vote.id',
DB::raw('100.0*计数(如果vir.is_correct=1,则为1 END)/COUNT(*)为pct_correct'),
DB::raw('100.0*计数(如果vir.is_correct=0,则为1 END)/COUNT(*)作为pct_不正确)
->join('vote_items'、'votes.id'、'='、'vote_items.vote_id')
->join('vote\u item\u users\u result'、'vote\u items.id'、'='、'vote\u item\u users\u result.vote\u item\u id')
->在哪里([
['vote_item_users_result.created_at','>','2018-08-01'],

['vote\u item\u users\u result.created\u at','您的问题相当混乱。请包含三个表中每个表的一些示例数据,然后理想地向我们显示预期的输出。Sum case似乎更复杂usual@Strawberry是的,也许更直观,但是,它需要更多的代码,正如您在上面所看到的,没有太多的空间来完成圆形。@草莓更好,但是,这依赖于MySQL。幸运的是,这是MySQL
DB::table('vote')
    ->select('vote.id',
             DB::raw('100.0 * COUNT(CASE WHEN vir.is_correct = 1 THEN 1 END) / COUNT(*) AS pct_correct'),
             DB::raw('100.0 * COUNT(CASE WHEN vir.is_correct = 0 THEN 1 END) / COUNT(*) AS pct_incorrect'))
    ->join('vote_items', 'votes.id', '=', 'vote_items.vote_id')
    ->join('vote_item_users_result', 'vote_items.id', '=', 'vote_item_users_result.vote_item_id ')
    ->where([
        ['vote_item_users_result.created_at', '>', '2018-08-01'],
        ['vote_item_users_result.created_at', '<', '2018-09-23'],
        ['vote.is_quiz', '=', '1'],
        ['vote.status', '=', 'A']
    ])
    ->groupBy('vote.id')
    ->get();