Как мы можем использовать count () с условным sql в select () laravel? - PullRequest
0 голосов
/ 30 октября 2019

У меня есть две таблицы, как показано ниже. Я использую метод DB Laravel, чтобы присоединиться к этой таблице. Но я не понимаю, как я могу получить количество баллов студентов за неудавшееся или пройденное. 0-failed 1-passed.

Ожидаемый результат:

1. Student Name
2. Student Id,
3. Count of failed based on student Id as count_failed
4. Total Marks based on student Id as total_marks

таблица students

`+----+-----------+
 | id |   name    |
 +----+-----------+
 |  1 | John Doe  |
 |  2 | Mark P    |
 |  3 | Pen Henry |
 +----+-----------+`

таблица students_marks:

 +----+------------+-------+-----------+
 | id | student_id | marks |is_failed  |
 +----+------------+-------+-----------+
 |  1 |          1 |    55 |  0        |
 |  2 |          2 |    44 |  1        |
 |  3 |          1 |    11 |  1        |
 |  4 |          2 |    10 |  0        |
 |  5 |          2 |    11 |  1        |
 |  6 |          2 |    20 |  0        |
 +----+------------+-------+-----------+

Ниже приведен запрос, который я использовал:

$users = DB::table('users')
        ->join('contacts', 'students.id', '=', 'students_marks.user_id')
        ->select('student.*')
        ->get();

Я не могу понять, как мы можем использовать count() с условным SQL в select() laravel?

Ответы [ 4 ]

0 голосов
/ 30 октября 2019

Попробуйте это

$users = DB::table('students s') ->leftJoin('students_mark sm', 's.id', '=', 'sm.student_id') ->groupBy('s.id','s.name') ->selectRaw("s.id,s.name,SUM(sm.is_failed) AS count_failed,SUM(sm.marks) as total_marks") ->get();

0 голосов
/ 30 октября 2019
 $users = DB::table('users')
                ->join('contacts', 'students.id', '=', 'students_marks.user_id')
                 ->select('student.*', DB::raw("count(students_marks.is_failed) as count")))
                 ->where('status', '=', 0)
                 ->get();

Попробуйте это. Если это не ясно или не работает, обратитесь к этому

0 голосов
/ 30 октября 2019

Попробуйте этот фрагмент кода

$table = DB::table('students_marks');
$table = $table->select(
        \DB::raw('SUM(if(is_failed = '0', 1, 0)) AS failed'), 
        \DB::raw('SUM(if(is_failed = '1', 1, 0)) AS passed'),
        \DB::raw('SUM(marks) AS total'));
        $table = $table->Join('students', 'students.id', '=', 'students_marks.student_id'); 
        $table = $table->get();
0 голосов
/ 30 октября 2019

Использовать условное агрегирование:

$users = DB::table('students s')
    ->leftJoin('students_mark sm', 's.id', '=', 'sm.user_id')
    ->groupBy('sm.id')
    ->select(DB::raw('s.id, s.name, SUM(sm.is_failed) AS num_failed, COUNT(sm.user_id) AS total_cnt'))
    ->get();

Это соответствует следующему необработанному MySQL-запросу:

SELECT
    s.id,
    s.name,
    SUM(sm.is_failed) AS num_failed,
    COUNT(sm.user_id) AS total_cnt
FROM students s
LEFT JOIN students_marks sm
    ON s.id = sm.user_id
GROUP BY
    s.id;

Примечание. В ANSI SQL допустимо выбирать поле name вПриведенный выше запрос GROUP BY предполагает, что student#id является столбцом первичного ключа для этой таблицы. Если приведенный выше запрос выдает ошибку ONLY_FULL_GROUP_BY, просто добавьте s.name к предложению GROUP BY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...