Использование функции агрегирования строк с подзапросом - PullRequest
0 голосов
/ 03 июня 2019

Этот запрос выбирает следующее:

SELECT jobs.JobID, school.School_Name, 
       CONCAT(staff.First_Name, ' ', staff.Last_Name) AS 'Full_Name', 
       staff.Phone_Number, role.Role
  FROM jobs
 INNER JOIN school ON jobs.SchoolID=school.SchoolID
 INNER JOIN staff ON jobs.StaffID=staff.staffID
 INNER JOIN role ON jobs.roleID=role.roleID
 ORDER BY staff.StaffID asc


JOB ID  FULL NAME   ROLE
------  ---------   ----------
1       BOB         PRINCIPLE
2       BOB         TEACHER
3       JACK        TEACHER
4       SARAH       ACCOUNTANT
5       SARAH       NURSE

ROLE ID    ROLE
------    ----------
1         TEACHER
2         PRINCIPLE
4         ACCOUNTANT
5         NURSE

Однако я хочу, чтобы результаты играли только роль с наибольшим RoleID:

BOB     PRINCIPLE
JACK    TEACHER
SARAH   NURSE

Я знаю, что могу объединить это в группы с помощью следующего, но что мне делать потом?

SELECT Full_Name, GROUP_CONCAT(Role) AS Role
  FROM
 (
  SELECT jobs.JobID, school.School_Name, CONCAT(staff.First_Name, ' ', staff.Last_Name) 
     AS Full_Name, staff.Phone_Number, role.Role
    FROM jobs
   INNER JOIN school ON jobs.SchoolID=school.SchoolID
   INNER JOIN staff ON jobs.StaffID=staff.staffID
   INNER JOIN role ON jobs.roleID=role.roleID
   ORDER BY staff.StaffID asc
 ) q
GROUP BY Full_Name

Насколько я понимаю, мне понадобится подзапрос для фильтрации строк? Любая помощь приветствуется, спасибо.

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Вы также можете проверить эту опцию -

SELECT
jobs.JobID, 
school.School_Name, 
CONCAT(staff.First_Name, ' ', staff.Last_Name) AS 'Full_Name', 
staff.Phone_Number, 
role.Role
FROM staff
INNER JOIN jobs ON jobs.StaffID=staff.staffID
INNER JOIN school ON jobs.SchoolID=school.SchoolID
INNER JOIN role ON jobs.roleID=role.roleID
INNER JOIN (
    SELECT staff.staffID,MAX(Jobs.roleid) roleid
    FROM Staff INNER JOIN Jobs  ON jobs.StaffID=staff.staffID
    GROUP BY staff.staffID
 ) A ON jobs.StaffID = A.StaffID AND Jobs.roleID = A.roleid
1 голос
/ 03 июня 2019

используйте связанный подзапрос

 select a.* from (
    SELECT jobs.JobID, school.School_Name, 
           CONCAT(staff.First_Name, ' ', staff.Last_Name) AS 'Full_Name', 
           staff.Phone_Number, role.Role,staff.staffID,role.roleID
      FROM jobs
     INNER JOIN school ON jobs.SchoolID=school.SchoolID
     INNER JOIN staff ON jobs.StaffID=staff.staffID
     INNER JOIN role ON jobs.roleID=role.roleID
   ) a
 where (a.staffID,a.roleID) in (
      SELECT staff.staffID,MAX(Jobs.roleid) roleID
FROM Staff INNER JOIN Jobs  ON jobs.StaffID=staff.staffID
GROUP BY staff.staffID)

или используйте rownumber (), если это mysql 8.0 или +

        select * from
      (
          SELECT jobs.JobID, school.School_Name, 
           CONCAT(staff.First_Name, ' ', staff.Last_Name) AS 'Full_Name', 
           staff.Phone_Number, role.Role,
        row_number()over(partition by role.Role order by jobs.JobID desc) rn
      FROM jobs
     INNER JOIN school ON jobs.SchoolID=school.SchoolID
     INNER JOIN staff ON jobs.StaffID=staff.staffID
     INNER JOIN role ON jobs.roleID=role.roleID
     ) a where a.rn=1
...