提问者:小点点

如何将表中的行与某些条件结合起来


我有多个表和我组合他们使用'join'(代码给下面),现在我有一个组合表,它给我正确的答案数量为一个特定的用户和一个特定的测验(给下面):

我想要添加或想要显示相同用户和测验的组合结果,如下所示:

下面是我的刀片代码:

<thead>
                                <tr>
                                <th>Quiz Name</th>
                                <th>Quiz ID</th>
                                <th>UserName</th>
                                <th>User ID</th>
                                <th>Correct</th>
                                </tr>
                            </thead>

                            <tbody>
                                @foreach($data_correct as $row)
                                
                                <tr>
                                <td>{{$row->qname}}</td>
                                <td>{{$row->quiz_id}}</td>
                                <td>{{$row->name}}</td>
                                <td>{{$row->user_id}}</td>
                                <td>{{$row->is_correct}}</td>
                                </tr>
                                @endforeach
                                
                            </tbody>

下面是我的控制器函数:

public function leaderboard(){

   
    $quizzes = (new Quiz)->allQuiz();

    $users = (new User)->allUsers();

    $data_correct = DB::table('results')
    ->join('answers', 'answers.id', 'results.answer_id')
    ->join('quizzes', 'quizzes.id', 'results.quiz_id')
    ->join('users', 'users.id', 'results.user_id')
    ->select('quizzes.qname', 'results.quiz_id','users.name' ,'results.user_id', 'answers.is_correct')->where('is_correct', 1)
    ->get();

    $data_wrong = DB::table('results')
    ->join('answers', 'answers.id', 'results.answer_id')
    ->select('results.quiz_id', 'results.user_id', 'answers.is_correct')->where('is_correct', 0)
    ->get();

    return view('leaderboard', compact('quizzes', 'data_correct', 'data_wrong'));

 }


共2个答案

匿名用户

试试这个兄弟

public function leaderboard(){
    $quizzes = (new Quiz)->allQuiz();
    $users = (new User)->allUsers();
    $data_correct = DB::table('users')
    ->join('answers', 'answers.id', 'results.answer_id')
    ->join('quizzes', 'quizzes.id', 'results.quiz_id')
    ->join('results', 'results.user_id', 'user.id')
    ->select(
       'quizzes.qname', 
       DB::raw('SUM(is_correct) as is_correct FROM answers where answers.id=results.answer_id'),
       'users.name' ,
       'results.user_id'
    )->
    where('answers.is_correct', 1)
    ->get();
    $data_wrong = DB::table('results')
    ->join('answers', 'answers.id', 'results.answer_id')
    ->select('results.quiz_id', 'results.user_id', 'answers.is_correct')->where('is_correct', 0)
    ->get();

    return view('leaderboard', compact('quizzes', 'data_correct', 'data_wrong'));

 }

匿名用户

如果我没看错的话,您可以在select查询中使用变量“quizzes.qname”。 但我只在测验表上看到名字。 请尝试以下操作:

public function leaderboard(){


$quizzes = (new Quiz)->allQuiz();

$users = (new User)->allUsers();

$data_correct = DB::table('results')
->join('answers', function ($join) {
    $join->on('answers.id', '=', 'results.answer_id')
        ->where('answers.is_correct', 1)
    })
->join('quizzes', 'quizzes.id', '=', 'results.quiz_id')
->join('users', 'users.id', '=', 'results.user_id')
->select('quizzes.qname', 'results.quiz_id','users.name' ,'results.user_id', DB::raw('count(answers.is_correct) as score'))
->groupBy('results.quiz_id', 'results.user_id')
->get();

$data_wrong = DB::table('results')
->join('answers', function ($join) {
    $join->on('answers.id', '=', 'results.answer_id')
        ->where('answers.is_correct', 0)
    })
->select('results.quiz_id', 'results.user_id', DB::raw('count(answers.is_correct) as score'))
->groupBy('results.quiz_id', 'results.user_id')
->get();

return view('leaderboard', compact('quizzes', 'data_correct', 'data_wrong'));

}

在你的评论之后我又调整了一遍。