Получить активные и неактивные записи из таблицы

У меня есть две таблицы:

tbl student :

.................
id  | Name |Age |
.................
1   | A    |15  |
2   | B    |13  |
3   | C    |12  |
.................

Еще одна таблица, например Tbl_student_details:

.......................
id  | stud_id |section |
.......................
1   | 1       |A       |
2   | 1       |B       |
3   | 2       |C       |
.......................


Result Expected: 
Active student : count (2) because id 1 and 2 have records in student detail table
Inactive Student :count(1)  dont have any record in student detail table

Что мне нужно, так это то, что я хочу активных или неактивных студентов.

если у какого-либо студента есть записи в student_details, то ему нужно количество этих учеников и для неактивных учеников у какого студента нет записей в таблице сведений о студенте Мне нужно подсчитать этих учеников, а также для неактивных учеников как я могу получить этого активного и неактивного студента, может ли кто-нибудь иметь представление, что мне нужен запрос в laravel DB :: raw, если это невозможно, просто предложите мне запрос, пожалуйста, помогите мне связать это ..

Каким будет ожидаемый результат согласно вашим выборочным данным? Кроме того, сохранение возраста не будет иметь никакого смысла в долгосрочной перспективе, иначе вам придется автоматически увеличивать его каждый год.

Madhur Bhaiya 26.10.2018 07:02

Используйте левое соединение для неактивных с IS NULL Tbl_student_details.id, используйте стандартное JOIN (INNER JOIN) для остальных.

ArtisticPhoenix 26.10.2018 07:03

вы используете отношения laravel?

Kapitan Teemo 26.10.2018 07:04

Капитан Тимо @ с использованием DB: raw

Ankita 26.10.2018 07:06

в ваших моделях. у тебя есть отношения?

Kapitan Teemo 26.10.2018 07:17

См.: meta.stackexchange.com/a/5235

Madhur Bhaiya 26.10.2018 12:24
2
6
1 238
4

Ответы 4

Вы можете попробовать использовать левое соединение и CASE WHEN

select 
   s.id,
   s.`Name`,
   s.`Age`, case when sd.stud_id is null then 'In Active' else 'Active' end as `StudentStatus`
from student s left join student_details sd 
on s.id=sd.stud_id

Вы можете использовать groupBy id для подсчета каждого идентификатора, оставив соединение между таблицей student_details и таблицей учеников.

 DB::table('student')
                ->leftJoin('Tbl_student_details ', 'student.id', '=', 'Tbl_student_details .id')
                ->groupBy('student.id')->count();
  • Чтобы рассмотреть всех студентов из таблицы student, вам нужно будет использовать Left Join, так что даже если в таблице Tbl_student_details нет соответствующей строки, вы все равно будете учитывать всех студентов.
  • Функция Count() может использоваться для подсчета Неактивных / Активных студентов. Функция Count() не считает значения NULL; поэтому мы можем использовать выражение Case .. When для подсчета неактивных студентов (NULL из-за несоответствия строки).
  • Чтобы подсчитать Уникальное количество Активных студентов, нам нужно будет использовать Count(Distinct ..), поскольку у вас есть повторяющиеся строки для stud_id в таблице Tbl_student_details.

Попробуйте следующий запрос:

SELECT 
  COUNT(CASE WHEN tsd.id IS NULL THEN 1 END) AS Inactive_students, 
  COUNT(DISTINCT tsd.stud_id) AS Active_students 
FROM 
student AS ts 
LEFT JOIN 
  Tbl_student_details AS tsd ON tsd.stud_id = ts.id 

Используя laravel, вы можете настроить свои модели для своих таблиц

class Student extends Model
{
    protected $table = 'student';

    public function details()
    {
        return $this->hasMany('App\StudentDetails');
    }
}


class StudentDetails extends Model
{
    protected $table = 'student_details';

    public function student()
    {
        return $this->belongsTo('App\Student');
    }
}

И через построитель запросов вы можете получить счет как

$students = App\Student::withCount('details')->get();

Выше будут возвращены все студенты вместе со свойством details_count, который даст вам желаемое количество из связанной таблицы.

Подсчет связанных моделей

Для активных / неактивных студентов вы можете писать так:

$activeStudents = App\Student::has('details')->count();
$inActiveStudents = App\Student::doesntHave('details')->count();

Другие вопросы по теме