SQL-запрос, получение нескольких дат для одной сущности - PullRequest
0 голосов
/ 05 ноября 2018

Я работаю над написанием 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

Я хочу, чтобы этот идентификатор использовался только один раз и считал время его появления. Проблема в отношениях в базе данных, которая имеет много дат, может отсутствовать у одного человека? Идентификатор был оставлен в select на данный момент для целей отладки, позже он будет удален.


EDIT

Теперь у меня есть запрос

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 голосов
/ 05 ноября 2018

Похоже, вы почти пришли к подсчету, но пропустили свой оператор GROUP BY

Если вы включите агрегатные функции, такие как COUNT (), но не включите GROUP BY, весь промежуточный результат будет принят за одну группу

Похоже, у вас также происходит странное CROSS JOIN с вашим двойным упоминанием таблицы учеников

Если вы хотите, чтобы даты отсутствия в каждой строке вам приходилось использовать другую агрегатную функцию, 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 */

[] указывают необязательные включения

0 голосов
/ 05 ноября 2018

Вы можете сделать это с group_concat. Это не совсем то, что вы описали, но это близко.

SELECT s.student_id,s.last_name,s.first_name, group_concat(a.date_absent) AS 'Dates Absent', COUNT(a.id) AS 'Total Absences' 
FROM `students` s JOIN `absences` a ON s.student_id = a.student_id
GROUP BY s.student_id

что должно дать

student_id | last_name | first_name | Dates Absent          | Total Absences
1          |   student |       name | 10/28/2018,10/29/2018 | 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...