Выпуск Mysql Views (повторяется) - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь извлечь отчет с использованием представлений MySQL, но для каждого пользователя повторяется новая строка, как показано на следующем рисунке

Не могли бы вы помочь мне переписать этот запрос, чтобы решить эту проблему?

DROP FUNCTION IF EXISTS adminExportFromDate;
  DROP FUNCTION IF EXISTS adminExportToDate;
  create function adminExportFromDate() returns DATETIME DETERMINISTIC NO SQL return @adminExportFromDate;
  create function adminExportToDate() returns DATETIME DETERMINISTIC NO SQL return @adminExportToDate;

  create or replace view admin_export as
     Select  admin.id as id ,CONCAT(admin.first_name," ",admin.last_name) as Name ,
             count(DISTINCT `all_jobs`.`id`)AS all_jobs_count,
             sum( case when `all_jobs`.job_status_id = 25 then 1 else 0 end ) as canceled_jobs_count,
             sum( case when `all_jobs`.job_status_id in (31,30,3) then 1 else 0 end ) as finished_jobs_count,
             0 as deleted_jobs_count
         From admin
             INNER  JOIN job all_jobs on all_jobs.created_by_id = admin.id and all_jobs.created_by_level = \'admin\'
             and `all_jobs`.`request_date` > AdminExportFromDate() AND `all_jobs`.`request_date` < AdminExportToDate()
      group by admin.id

      UNION ALL

  select admin.id,CONCAT(admin.first_name," ",admin.last_name) as Name,
  0 AS all_jobs_count,
  0 as canceled_jobs_count,
  0 as finished_jobs_count,
  count( deleted_log.id ) as deleted_jobs_count

  From admin INNER JOIN deleted_log
      on deleted_log.`type` LIKE \'job\' and data RLIKE CONCAT(\'"created_by_level":"admin","created_by_id":"\',`admin`.`id`,\'"\') and `deleted_log`.`created_at` > AdminExportFromDate() AND `deleted_log`.`created_at` < AdminExportToDate()
      group by admin.id

И это результат просмотра:

enter image description here

1 Ответ

0 голосов
/ 07 июня 2018

UNION ALL / UNION создает несколько строк.Вы хотите собрать ряды вместе.Обычно это вместо JOIN.

В этом случае, я думаю, что-то вроде этого делает то, что вы хотите:

Select a.id as id, CONCAT(a.first_name, ' ', a.last_name) as Name,
       coalesce(j.all_jobs_count, 0) as all_jobs_count,
       coalesce(j.canceled_jobs_count, 0) as canceled_jobs_count,
       coalesce(j.finished_jobs_count, 0) as finished_jobs_count,
       coalesce(0, deleted_jobs_count) as deleted_jobs_count
From admin a left join
     (select j.created_by_id,
             count(distinct j.id) as all_jobs_count,
             sum(  j.job_status_id = 25 ) as canceled_jobs_count,
             sum( j.job_status_id in (31, 30, 3) ) as finished_jobs_count
      from job j
      where j.created_by_level = \'admin\' and
            j.request_date > AdminExportFromDate() and
            j.request_date < AdminExportToDate()
      group by j.created_by_id
     ) j
     on j.created_by_id = a.id left join
     (select dl.data, count(*) as deleted_jobs_count
      from deleted_log dl
      where dl.`type` LIKE \'job\' and
            dl.`created_at` > AdminExportFromDate() AND
            dl.`created_at` < AdminExportToDate()
      group by dl.data
     ) dl
     on dl.data RLIKE CONCAT(\'"created_by_level":"admin", "created_by_id":"\', a.id, \'"\')

РЕДАКТИРОВАТЬ:

Выше очевидно выигралне работает для просмотра в MySQL (arggh!).Вместо этого можно использовать подзапросы в предложении from:

Select a.id as id, CONCAT(a.first_name, ' ', a.last_name) as Name,
       (select count(*)
        from jobs j
        where j.created_by_id = a.id and
              j.created_by_level = \'admin\' and
              j.request_date > AdminExportFromDate() and
              j.request_date < AdminExportToDate()
       )  as all_jobs_count,
       (select count(*)
        from jobs j
        where j.created_by_id = a.id and
              j.created_by_level = \'admin\' and
              j.request_date > AdminExportFromDate() and
              j.request_date < AdminExportToDate() and
              j.job_status = 25
       )  as canceled_jobs_count,
       (select count(*)
        from jobs j
        where j.created_by_id = a.id and
              j.created_by_level = \'admin\' and
              j.request_date > AdminExportFromDate() and
              j.request_date < AdminExportToDate() and
              j.job_status in (31, 30, 3)
       ) as finished_jobs_count,
     (select count(*) as deleted_jobs_count
      from deleted_log dl
      where dl.data rlike concat(\'"created_by_level":"admin", "created_by_id":"\', a.id, \'"\') and
            dl.`type` like \'job\' and
            dl.`created_at` > AdminExportFromDate() AND
            dl.`created_at` < AdminExportToDate()
     ) as deleted_jobs_count
From admin a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...