我正在编写一个SQL查询以生成一个看起来像这样的表:
Name |Dates Absent|Total Absences
student |10/28/2018 | 2
|10/29/2018 |
我目前有一个数据库,其中有2个表,这些表是较大系统的一部分,其中包含所需的数据(缺勤,学生)。
我尝试了以下查询
SELECT s.student_id,s.last_name,s.first_name, COUNT(s.student_id) AS 'Total Absences'
FROM `students` s, `absences` a INNER JOIN students ON students.student_id=a.student_id
得出以下结果:
student_id | last_name | first_name | Total Absences
1 | student | name | 12464
我希望它仅使用每个ID一次并计算它出现的次数。数据库中的关系是否存在一个问题,这个问题有很多人可能缺席?该ID暂时留在选择中用于调试目的,稍后将删除它。
编辑
我现在有了查询
SELECT s.last_name, s.first_name,a.date_absence, COUNT(s.student_id) AS 'Total Absences'
FROM `students` s, `absences` a
INNER JOIN students ON students.student_id=a.student_id
GROUP BY s.student_ID
这仅显示日期之一,如何在不重新显示学生信息的情况下添加所有日期?
答案 0 :(得分:4)
您可以使用group_concat进行此操作。并不是您所希望的,但是已经接近了。
function mutation(arr) {
var test = arr[1].toLowerCase();
var target = arr[0].toLowerCase();
for (var i = 0; i < test.length; i++) {
if (target.indexOf(test[i]) < 0) {
return false;
}
}
return true;
}
console.log(mutation(['hello', 'hey']));
console.log(mutation(['hello', 'helo']));
应该产生
dataTable = $('#' + tblID).DataTable({
dom: 'Bfrtip',
buttons: [
'copy', 'csv', 'excel', 'print',
{
extend: 'pdfHtml5',
orientation: 'landscape',
pageSize: 'LEGAL'
}
],
orderCellsTop: true,
fixedHeader: {
header: true,
footer: true
},
scrollX: true,
scrollY: "400px",
scrollCollapse: true,
iDisplayLength: 25,
drawCallback: function( settings ) {
// Reset margin to 0 after datatable render
var ele = document.querySelector('.dataTables_scrollBody');
if(ele){
ele = ele.querySelector('.dataTable');
if(ele){
ele.style.margin = 0;
}
}
},
language: {
"emptyTable": "No records were found."
}
});
答案 1 :(得分:1)
您似乎正在计数,但是缺少GROUP BY语句
如果您包含诸如COUNT()之类的聚合函数,但不包括GROUP BY,则整个中间结果将被视为一个组
您似乎也有一个奇怪的CROSS JOIN,重复提到了Students表
如果要在每一行中缺勤日期,则必须使用另一个汇总函数GROUP_CONCAT()
类似的东西
SELECT s.student_id, /** Include as names could feasibly be duplicated */
CONCAT(s.first_name, ' ', s.last_name) name,
GROUP_CONCAT([DISTINCT] a.date) dates_absent, /** May want distinct here if more than one absence is possible per diem */
COUNT(*) total_absences
FROM students s
JOIN absences a
ON a.student_id = s.student_id
GROUP BY s.student_id[, name] /** name required for SQL standard */
[ORDER BY name [ASC]] /** You'll probably want some kind of ordering */
[]
表示可选包含