Почему мой запрос не возвращает строк?

0

Вот мой запрос:

SELECT s.student_id as 'Student_Number', CONCAT(IFNULL(s.student_fname,''),' ', 
          IFNULL(s.student_mname,''),' ', IFNULL(s.student_lname,'')) 'Student_Name',s.student_program as 'Program', 
          (SUM(IF(stat.status_description='Late',1,0))) 'Total_Lates',
          (SUM(IF(stat.status_description='Absent',1,0))) 'Total_Absences', 
          Floor((SUM(IF(stat.status_description='Late',1,0))) / 3 + (SUM(IF(stat.status_description='Absent',1,0)))) 'Total_Absence_with_Lates' 
FROM attendance_tbl a 
LEFT JOIN student_tbl s ON s.student_id=a.entity_id 
LEFT JOIN status_tbl stat ON stat.status_id=a.status_id 
left join announcement_tbl ann on ann.announcement_date=a.date 
where a.course_id='SS019' and a.entity_type='Student' 
   and CONCAT(IFNULL(s.student_fname,''),' ', IFNULL(s.student_mname,''),' ', IFNULL(s.student_lname,'')) 
   and a.date!=ann.announcement_date and ann.announcement_description!='holiday' 
GROUP BY a.entity_id, CONCAT(IFNULL(s.student_fname,''),' ', IFNULL(s.student_mname,''),' ', IFNULL(s.student_lname,'')) 
order by Student_Name ASC

Вот таблицы, которые я использовал:

visitance_tbl: http://prntscr.com/j21rib

он хранит посещаемость студентов каждый день для определенного курса, комнаты, секции

status_tbl: http://prntscr.com/j21ro8

таблица состояния содержит легенду status_id в таблице посещаемости

student_tbl: http://prntscr.com/j21spa

он содержит номер студента, имя и т.д. студента

advert_tbl: http://prntscr.com/j21s5h

он сохраняет объявления, если описание праздника, оно не будет учитывать посещаемость студента в эту конкретную дату.

Моя проблема в том, что он не возвращает строк. На моей таблице объявлений, как показано на экране, дата указывает на праздник 24 марта 2018 года. Все присутствующие на эту дату не должны учитываться. Поэтому две оставшиеся данные за 25 марта 2018 года должны быть показаны, так как это не праздник. Может ли помочь мне, почему он не возвращает никаких данных?

  • 0
    Я предпочитаю COALESCE чем IFNULL он более совместим с другими БД
  • 0
    Честно говоря, этот запрос настолько нечитаем, что в смешанном регистре LEFT JOIN а затем left join и очень запутано с константами. Я бы попробовал упростить это. Я пытался решить это, но это просто грязно для меня, извините.
Показать ещё 2 комментария
Теги:

1 ответ

0

Хорошо, у меня может быть что-то, так как я сказал, что этот запрос очень сложный, слишком я думаю.

В любом случае я сломал все это так, чтобы он был несколько читабельным

    SELECT
        s.student_id as 'Student_Number',
        CONCAT(
            IFNULL(s.student_fname,''),
            ' ',
            IFNULL(s.student_mname,''),
            ' ',
            FNULL(s.student_lname,'')
        ) 'Student_Name',
        s.student_program as 'Program',
        (SUM(IF(stat.status_description='Late',1,0))) 'Total_Lates',
        (SUM(IF(stat.status_description='Absent',1,0))) 'Total_Absences',
        Floor((SUM(IF(stat.status_description='Late',1,0))) / 3 + (SUM(IF(stat.status_description='Absent',1,0)))) 'Total_Absence_with_Lates'  
    FROM
        attendance_tbl a
    LEFT JOIN
        student_tbl s ON s.student_id=a.entity_id
    LEFT JOIN
        status_tbl stat ON stat.status_id=a.status_id
    left join
        announcement_tbl ann on ann.announcement_date=a.date
    where
        a.course_id='SS019'
    and
        a.entity_type='Student'
    and
        CONCAT(IFNULL(s.student_fname,''),' ', IFNULL(s.student_mname,''),' ', IFNULL(s.student_lname,''))
    and
        a.date!=ann.announcement_date
    and
        ann.announcement_description!='holiday'
    GROUP BY
        a.entity_id, CONCAT(IFNULL(s.student_fname,''),' ', IFNULL(s.student_mname,''),' ', IFNULL(s.student_lname,''))
    order by
        Student_Name A

Я не знаю, что это за намерение.

and
  CONCAT(IFNULL(s.student_fname,''),' ', IFNULL(s.student_mname,''),' ', IFNULL(s.student_lname,''))
and

Но если все они равны нулю, они конкатцируют только пустое пространство, которое не соответствует ни одному из БД, которое я проверил с этим запросом.

CREATE TABLE test(
  foo VARCHAR(1),
  bar VARCHAR(1)
);

INSERT INTO test (foo)VALUES('a');

SELECT * FROM test WHERE CONCAT(IFNULL(bar,''),' ');

Вы можете видеть это в этой скрипке

https://www.db-fiddle.com/f/9512ewbrSQjLC41tY3chrx/0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню