Вот мой запрос:
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 года должны быть показаны, так как это не праздник. Может ли помочь мне, почему он не возвращает никаких данных?
Хорошо, у меня может быть что-то, так как я сказал, что этот запрос очень сложный, слишком я думаю.
В любом случае я сломал все это так, чтобы он был несколько читабельным
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
Конечно, любой из этих и условий может быть неправильным, и он не будет возвращать результаты. Без скрипки и некоторых выборочных данных это лучшее, что я могу сделать.
COALESCE
чемIFNULL
он более совместим с другими БДLEFT JOIN
а затемleft join
и очень запутано с константами. Я бы попробовал упростить это. Я пытался решить это, но это просто грязно для меня, извините.