【发布时间】:2018-11-02 12:25:49
【问题描述】:
我有一张表,我需要计算所有在场的学生,以显示有多少出勤学生
在我的表中有以下列
school id
Student id
year
Month
Status
day_1
day_2
day_3
To
day_31
【问题讨论】:
-
考虑规范化您的架构。请记住,数据库表不是电子表格
标签: mysql sql codeigniter
我有一张表,我需要计算所有在场的学生,以显示有多少出勤学生
在我的表中有以下列
school id
Student id
year
Month
Status
day_1
day_2
day_3
To
day_31
【问题讨论】:
标签: mysql sql codeigniter
这是一个不同的技巧。虽然它适用于 MySql 8.0+
将 day_n 字段连接成一个字符串。
然后从该字符串中删除所有不是“P”的字符。
那么剩余字符串的字符长度将是总'P'。
SELECT school_id, student_id, month, year,
CHAR_LENGTH(
REGEXP_REPLACE(
CONCAT_WS('' -- using concat_ws because concat returns null when one of the fields is null
, day_1
, day_2
-- add more day_n here
, day_31),'[^P]+','')) AS present
FROM YourTable
【讨论】:
更传统的方法可能如下所示:
student_id,
attendance_date
【讨论】:
您可以查询所有学生的ID,
$sql2 = "SELECT distinct id from table";
$query = $this->db->query($sql2);
foreach ($query->result() as $innerrow) {
HERE YOU USE THE SYNTAX OF NEXT CODE-BLOCK
}
在 foreach 循环中,您可以使用带有 $row->id 的 id 来生成另一个 sql 查询
带有 where 子句。
$sql = "SELECT table.* from table where id = ".$row->id;
$query = $this->db->query($sql);
foreach ($query->result() as $row) {
print your data
}
【讨论】:
编写查询以查找出席的出席者像
select (if(day_1 in('P'),1,0)+if(day_2 in('P'),1,0)+if(day_3 in('P'),1,0)+if(day_4 in('P'),1,0)+if(day_5 in('P'),1,0)+if(day_6 in('P'),1,0) + if(day_7 in('P'),1,0)+if(day_8 in('P'),1,0)+if(day_9 in('P'),1,0)+....+if(day_n in('P'),1,0)) as day_present from tbl_name
但是 if 条件适用于所有 31 天或 30 天,按月天数计算
只需在您的 mysql 查询编辑器中尝试一次,您就会得到准确的结果。。
在codeigniter中
$result = $this->db->select("(if(day_1 in('P'),1,0)+if(day_2 in('P'),1,0)+if(day_3 in(') P'),1,0)+if(day_4 in('P'),1,0)+........+if(day_n in('P'),1,0)) 存在, school_id, student_id,year, month, status");
$this->db->get('table_name');
【讨论】:
id int(11) NOT NULL, school_id int(11) NOT NULL, teacher_id int(11) NOT NULL, academic_year_id int(11) NOT NULL , month varchar(10) 字符集 utf8 非空,year varchar(10) 字符集 utf8 非空,day_1 varchar(1) 字符集 utf8 默认空,day_2 varchar(1) 字符集 utf8默认空,day_3varchar(1) 字符集 utf8 默认空,day_4varchar(1) 字符集 utf8 默认空,day_5varchar(1) 字符集 utf8 默认空到day_31 。