SQL查询,为一个实体获取多个日期

时间:2018-11-05 17:54:12

标签: mysql sql database

我正在编写一个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

这仅显示日期之一,如何在不重新显示学生信息的情况下添加所有日期?

2 个答案:

答案 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 */

[]表示可选包含