MySQL объединяет несколько запросов для отчета

См. SQLFiddle здесь: http://sqlfiddle.com/#!9/9bb273

Мне нужно создать отчет по 3 запросам. Это должен быть единый запрос без подзапросов (из-за ограничений ORM).

Основной запрос:

SELECT SQL_CALC_FOUND_ROWS 
Organization.name as organization_name, 
Program.unique_id as program_uuid, 
Program.name as program_name,
Program.start_date,
Program.end_date,
Program.grace_period,
'Placeholder A' as 'Participant Count',
'Placeholder B' as 'Total Participant Points',
count(distinct Transaction.id) as 'Transaction Count',
sum(TransactionItem.quantity) as 'Total Redemptions',
sum(((TransactionProduct.retail + IFNULL(TransactionProduct.shipping,0) + IFNULL(TransactionProduct.handling,0)) * TransactionItem.quantity)) as 'Total'
FROM `TransactionItem` 
JOIN `Transaction` ON `Transaction`.id = `TransactionItem`.transaction_id 
JOIN `TransactionProduct` ON `TransactionItem`.reference_id = `TransactionProduct`.reference_id 
JOIN `Participant` ON `Transaction`.participant_id = `Participant`.id 
JOIN `Program` ON `Program`.id = `Participant`.program_id 
JOIN `Organization` ON `Organization`.id = `Participant`.organization_id 
WHERE 1=1  
AND `Organization`.`unique_id` = 'demo2' 
AND `Program`.`unique_id` = 'demo2' 
AND `Transaction`.`created_at` >= '2018-10-01 00:00:00' 
AND `Transaction`.`created_at` <= '2018-12-18 00:00:00';

Как видите, этот отчет предназначен для диапазона дат между 01.10 и 18.12. Набор результатов, из которого состоит отчет, - это ...

organization_name | program_uuid | program_name | start_date | end_date | grace_period | Participant Count | Total Participant Points | Transaction Count | Total Redemptions | Total
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Demo2 Org           demo2          Demo2          2018-10-01   2018-12-27  5             Placeholder A       Placeholder B              11                   92                 2853.13

Как видите, есть 2 точки данных, которые я не могу получить из этого запроса.

(1) Общее количество участников, принадлежащих к программе "demo2". Этот запрос получает эту точку данных.

/* Placeholder A */
select program_id, count(*) as 'Participant Count' from participant 
where active = 1
group by program_id;

Возврат:

program_id   |  Participant Count
----------------------------------
2               102

(2) Сумма Adjustments.amount для всех строк между датами 01.10 и 18.12. Этот запрос выполняет это.

/* Placeholder B */
select sum(amount) as 'Total Particpant Points' from adjustment 
where participant_id in (select id from participant where program_id =2)
and type = 1
and created_at >= '2018-10-01 00:00:00' and created_at <= '2018-12-18 00:00:00';

Возврат:

 Total Participant Points
 ------------------------
 10000.50000

Есть ли способ собрать все эти данные в одном запросе без подзапросов?

без определения таблицы, выборочных данных и ожидаемых результатов трудно помочь. Что ты пробовал?

Lelio Faieta 19.12.2018 18:05

В первой строке вопроса находится SQLFiddle со схемой и тестовыми данными.

scott80109 19.12.2018 18:24

Вы можете использовать OVER(), если ваш MySQL поддерживает его.

Eric 19.12.2018 18:32

Это не. :(

scott80109 20.12.2018 00:23

Почему бы вам не использовать параметрическую хранимую процедуру для получения этих результатов в виде атомарных выходных данных.

Muhammad Waheed 24.01.2019 13:05
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
5
71
0

Другие вопросы по теме