MySQL, чтобы получить максимальную дату для каждого идентификатора пользователя и преобразовать их в продолжение - PullRequest
0 голосов
/ 01 августа 2020

Вот мой MySQL запрос

SELECT a.id,
       a.name,
       a.pname,
       b.skill,
       date_add(a.end_date, interval 1 DAY) AS available_date
FROM
  (SELECT user.id,
          concat(user.first_name, " ", user.last_name) AS name,
          resource_allocated.project_id,
          project.project_name AS pname,
          resource_allocated.end_date
   FROM USER
   RIGHT JOIN resource_allocated ON user.id = resource_allocated.user_id
   RIGHT JOIN project ON resource_allocated.project_id = project.id
   WHERE resource_allocated.is_active=1) a
LEFT JOIN
  (SELECT user.id,
          concat(user.first_name, " ", user.last_name) AS name,
          user_skill.skill_id,
          skill.skill_name AS skill
   FROM USER
   RIGHT JOIN user_skill ON user.id = user_skill.user_id
   RIGHT JOIN skill ON user_skill.skill_id = skill.id) b ON a.id = b.id
ORDER BY a.id;

Вот как выглядит результат:

+----+----------+-------+-------+----------------+
| id |   name   | pname | skill | available_date |
+----+----------+-------+-------+----------------+
|  1 | john doe | hms   | php   | 2019-01-02     |
|  1 | john doe | hms   | react | 2019-01-02     |
|  2 | jane doe | hms   | java  | 2020-01-16     |
|  2 | jane doe | IS    | java  | 2019-06-21     |
|  2 | jane doe | hms   | js    | 2020-01-16     |
|  2 | jane doe | IS    | js    | 2019-06-21     |
+----+----------+-------+-------+----------------+

Я хочу mysql запрос, чтобы получить максимальную дату для каждого пользователя , что-то вроде этого:

+----+----------+-------+-------+----------------+
| id |   name   | pname | skill | available_date |
+----+----------+-------+-------+----------------+
|  1 | john doe | hms   | php   | 2019-01-02     |
|  1 | john doe | hms   | react | 2019-01-02     |
|  2 | jane doe | hms   | java  | 2020-01-16     |
|  2 | jane doe | IS    | java  | 2020-01-16     |
|  2 | jane doe | hms   | js    | 2020-01-16     |
|  2 | jane doe | IS    | js    | 2020-01-16     |
+----+----------+-------+-------+----------------+

Если возможно, может ли кто-нибудь предоставить эквивалентный код продолжения для результирующего запроса? Заранее спасибо.

1 Ответ

1 голос
/ 01 августа 2020

Если вы хотите получить максимальную дату (или последнюю дату) в своих результатах, используйте функцию max(), а также используйте group by name , pname в конце

max(date_add(a.end_date, interval 1 day)) as available_date

И если вы хотите организовать их по дате, затем напишите это в конце запроса:

group by name, pname order by available_date

, чтобы окончательный запрос выглядел так:

SELECT a.id,
       a.name,
       a.pname,
       b.skill,
       max(date_add(a.end_date, interval 1 day)) as available_date
FROM
  (SELECT user.id,
          concat(user.first_name, " ", user.last_name) AS name,
          resource_allocated.project_id,
          project.project_name AS pname,
          resource_allocated.end_date
   FROM USER
   RIGHT JOIN resource_allocated ON user.id = resource_allocated.user_id
   RIGHT JOIN project ON resource_allocated.project_id = project.id
   WHERE resource_allocated.is_active=1) a
LEFT JOIN
  (SELECT user.id,
          concat(user.first_name, " ", user.last_name) AS name,
          user_skill.skill_id,
          skill.skill_name AS skill
   FROM USER
   RIGHT JOIN user_skill ON user.id = user_skill.user_id
   RIGHT JOIN skill ON user_skill.skill_id = skill.id) b ON (a.id = b.id)
GROUP by name, pname , skill
ORDER by a.id, available_date;
...