在 MySQL Workbench 8.0 上构建冗长的查询
Structuring a lengthy query on MySQL Workbench 8.0
我在 MySQL Workbench 上有以下查询定义:
use myDB;
select basic_product_id,
offer_id,
model_type,
model_id,
sum(initial_quantity) as initial_quantity,
sum(quantity_on_offer) as quantity_on_offer,
sum(sold_quantity) as sold_quantity,
sum(remaining_quantity) as remaining_quantity,
products_display_max,
offers_display_max,
minimum_purchase_quantity,
maximum_purchase_quantity,
pct,
date_begins,
date_ends,
feature_from,
feature_through,
inactive
from (
select *
from (
select
products.id as product_id,
products.basic_product_id as basic_product_id,
offers.id as offer_id,
'App\\Models\\Category' as model_type,
categories.id as model_id,
products.initial_quantity,
offers.total_quantity as quantity_on_offer,
sum(sales.quantity) as sold_quantity,
CASE
WHEN offers.total_quantity is not null
THEN coalesce(offers.total_quantity, 0) - coalesce(sum(sales.quantity), 0)
ELSE coalesce(products.initial_quantity, 0) - coalesce(sum(sales.quantity), 0)
END as remaining_quantity,
products.quantity_maximum_display as products_display_max,
offers.quantity_maximum_display as offers_display_max,
offers.minimum_purchase_quantity, offers.maximum_purchase_quantity,
offers.pct,maximum_purchase_quantity
offers.date_begins, offers.date_ends,
offers.feature_from, offers.feature_through,
offers.inactive
from
products
left join basic_products on products.basic_product_id = basic_products.id
left join categories on basic_products.categoria_id = categories.id
join offers on offers.categoria_id = categories.id
left join sales on sales.offer_id = offers.id AND sales.product_id = products.id AND sales.deleted_at is null
group by products.id, offers.id
) as basic_products_offers_categories
UNION ALL
select *
from (
select
products.id as product_id,
products.basic_product_id as basic_product_id,
offers.id as offer_id,
'App\\Models\\Store' as model_type,
stores.id as model_id,
products.initial_quantity,
offers.total_quantity as quantity_on_offer,
sum(sales.quantity) as sold_quantity,
CASE
WHEN offers.total_quantity is not null
THEN coalesce(offers.total_quantity, 0) - coalesce(sum(sales.quantity), 0)
ELSE coalesce(products.initial_quantity, 0) - coalesce(sum(sales.quantity), 0)
END as remaining_quantity,
products.quantity_maximum_display as products_display_max,
offers.quantity_maximum_display as offers_display_max,
offers.minimum_purchase_quantity, offers.maximum_purchase_quantity,
offers.pct, maximum_purchase_quantity
offers.date_begins, offers.date_ends,
offers.feature_from, offers.feature_through,
offers.inactive
from
products
left join basic_products on products.basic_product_id = basic_products.id
left join stores on basic_products.store_id = stores.id
join offers on offers.store_id = stores.id
left join sales on sales.offer_id = offers.id AND sales.product_id = products.id AND sales.deleted_at is null
group by products.id, offers.id
) as basic_products_ofertas_stores
UNION ALL
select *
from (
select
products.id as product_id,
products.basic_product_id as basic_product_id,
offers.id as offer_id,
'App\\Models\\BasicProduct' as model_type,
basic_products.id as model_id,
products.initial_quantity,
offers.total_quantity as quantity_on_offer,
sum(sales.quantity) as sold_quantity,
CASE
WHEN offers.total_quantity is not null
THEN coalesce(offers.total_quantity, 0) - coalesce(sum(sales.quantity), 0)
ELSE coalesce(products.initial_quantity, 0) - coalesce(sum(sales.quantity), 0)
END as remaining_quantity,
products.quantity_maximum_display as products_display_max,
offers.quantity_maximum_display as offers_display_max,
offers.minimum_purchase_quantity, offers.maximum_purchase_quantity,
offers.pct,maximum_purchase_quantity
offers.date_begins, offers.date_ends,
offers.feature_from, offers.feature_through,
offers.inactive
from
products
left join basic_products on products.basic_product_id = basic_products.id
join offers on offers.basic_product_id = basic_products.id
left join sales on sales.offer_id = offers.id AND sales.product_id = products.id AND sales.deleted_at is null
group by products.id, offers.id
) as basic_products_ofertas_basic_products
) as basic_products_offers_quantities
group by basic_product_id, offer_id
order by basic_product_id
它工作正常但非常冗长且容易出错,所以我想知道是否有可能通过将部分查询提取到已保存的 .sql 文件中以某种方式以更“模块化”的方式安排它并且只是从“主”查询调用它有点像 Laravel Blade @include 指令。类似于以下内容:
use myDB;
select basic_product_id,
offer_id,
model_type,
model_id,
sum(initial_quantity) as initial_quantity,
sum(quantity_on_offer) as quantity_on_offer,
sum(sold_quantity) as sold_quantity,
sum(remaining_quantity) as remaining_quantity,
products_display_max,
offers_display_max,
minimum_purchase_quantity,
maximum_purchase_quantity,
pct,
date_begins,
date_ends,
feature_from,
feature_through,
inactive
from (
select *
from (
**Insert .sql file here for basic_products_offers_categories**
) as basic_products_offers_categories
UNION ALL
select *
from (
**Insert .sql file for basic_products_offers_stores**
) as basic_products_offers_stores
UNION ALL
select *
from (
**Insert .sql file for basic_products_offers_basic_products**
) as basic_products_offers_basic_products
) as basic_products_offers_quantities
group by basic_product_id, offer_id
order by basic_product_id
我通读了文档,但找不到任何内容。顺便说一下...原始查询(和表格)是西班牙语的,我在翻译这个 post 时可能漏掉了一些东西,所以“不要在家里尝试这个!”。谢谢
根据@Akina 的建议,可以使用视图以模块化方式在 MySQL 上工作。在我看来,视图是基于查询的动态表,可以作为独立查询或作为更大查询的组件,这使它们成为构建更大项目时非常有用的工具,并且非常容易实现。我不想在这里重现已经完成的内容,而是推荐以下教程:
https://www.mysqltutorial.org/create-sql-views-mysql.aspx
干杯!
我在 MySQL Workbench 上有以下查询定义:
use myDB;
select basic_product_id,
offer_id,
model_type,
model_id,
sum(initial_quantity) as initial_quantity,
sum(quantity_on_offer) as quantity_on_offer,
sum(sold_quantity) as sold_quantity,
sum(remaining_quantity) as remaining_quantity,
products_display_max,
offers_display_max,
minimum_purchase_quantity,
maximum_purchase_quantity,
pct,
date_begins,
date_ends,
feature_from,
feature_through,
inactive
from (
select *
from (
select
products.id as product_id,
products.basic_product_id as basic_product_id,
offers.id as offer_id,
'App\\Models\\Category' as model_type,
categories.id as model_id,
products.initial_quantity,
offers.total_quantity as quantity_on_offer,
sum(sales.quantity) as sold_quantity,
CASE
WHEN offers.total_quantity is not null
THEN coalesce(offers.total_quantity, 0) - coalesce(sum(sales.quantity), 0)
ELSE coalesce(products.initial_quantity, 0) - coalesce(sum(sales.quantity), 0)
END as remaining_quantity,
products.quantity_maximum_display as products_display_max,
offers.quantity_maximum_display as offers_display_max,
offers.minimum_purchase_quantity, offers.maximum_purchase_quantity,
offers.pct,maximum_purchase_quantity
offers.date_begins, offers.date_ends,
offers.feature_from, offers.feature_through,
offers.inactive
from
products
left join basic_products on products.basic_product_id = basic_products.id
left join categories on basic_products.categoria_id = categories.id
join offers on offers.categoria_id = categories.id
left join sales on sales.offer_id = offers.id AND sales.product_id = products.id AND sales.deleted_at is null
group by products.id, offers.id
) as basic_products_offers_categories
UNION ALL
select *
from (
select
products.id as product_id,
products.basic_product_id as basic_product_id,
offers.id as offer_id,
'App\\Models\\Store' as model_type,
stores.id as model_id,
products.initial_quantity,
offers.total_quantity as quantity_on_offer,
sum(sales.quantity) as sold_quantity,
CASE
WHEN offers.total_quantity is not null
THEN coalesce(offers.total_quantity, 0) - coalesce(sum(sales.quantity), 0)
ELSE coalesce(products.initial_quantity, 0) - coalesce(sum(sales.quantity), 0)
END as remaining_quantity,
products.quantity_maximum_display as products_display_max,
offers.quantity_maximum_display as offers_display_max,
offers.minimum_purchase_quantity, offers.maximum_purchase_quantity,
offers.pct, maximum_purchase_quantity
offers.date_begins, offers.date_ends,
offers.feature_from, offers.feature_through,
offers.inactive
from
products
left join basic_products on products.basic_product_id = basic_products.id
left join stores on basic_products.store_id = stores.id
join offers on offers.store_id = stores.id
left join sales on sales.offer_id = offers.id AND sales.product_id = products.id AND sales.deleted_at is null
group by products.id, offers.id
) as basic_products_ofertas_stores
UNION ALL
select *
from (
select
products.id as product_id,
products.basic_product_id as basic_product_id,
offers.id as offer_id,
'App\\Models\\BasicProduct' as model_type,
basic_products.id as model_id,
products.initial_quantity,
offers.total_quantity as quantity_on_offer,
sum(sales.quantity) as sold_quantity,
CASE
WHEN offers.total_quantity is not null
THEN coalesce(offers.total_quantity, 0) - coalesce(sum(sales.quantity), 0)
ELSE coalesce(products.initial_quantity, 0) - coalesce(sum(sales.quantity), 0)
END as remaining_quantity,
products.quantity_maximum_display as products_display_max,
offers.quantity_maximum_display as offers_display_max,
offers.minimum_purchase_quantity, offers.maximum_purchase_quantity,
offers.pct,maximum_purchase_quantity
offers.date_begins, offers.date_ends,
offers.feature_from, offers.feature_through,
offers.inactive
from
products
left join basic_products on products.basic_product_id = basic_products.id
join offers on offers.basic_product_id = basic_products.id
left join sales on sales.offer_id = offers.id AND sales.product_id = products.id AND sales.deleted_at is null
group by products.id, offers.id
) as basic_products_ofertas_basic_products
) as basic_products_offers_quantities
group by basic_product_id, offer_id
order by basic_product_id
它工作正常但非常冗长且容易出错,所以我想知道是否有可能通过将部分查询提取到已保存的 .sql 文件中以某种方式以更“模块化”的方式安排它并且只是从“主”查询调用它有点像 Laravel Blade @include 指令。类似于以下内容:
use myDB;
select basic_product_id,
offer_id,
model_type,
model_id,
sum(initial_quantity) as initial_quantity,
sum(quantity_on_offer) as quantity_on_offer,
sum(sold_quantity) as sold_quantity,
sum(remaining_quantity) as remaining_quantity,
products_display_max,
offers_display_max,
minimum_purchase_quantity,
maximum_purchase_quantity,
pct,
date_begins,
date_ends,
feature_from,
feature_through,
inactive
from (
select *
from (
**Insert .sql file here for basic_products_offers_categories**
) as basic_products_offers_categories
UNION ALL
select *
from (
**Insert .sql file for basic_products_offers_stores**
) as basic_products_offers_stores
UNION ALL
select *
from (
**Insert .sql file for basic_products_offers_basic_products**
) as basic_products_offers_basic_products
) as basic_products_offers_quantities
group by basic_product_id, offer_id
order by basic_product_id
我通读了文档,但找不到任何内容。顺便说一下...原始查询(和表格)是西班牙语的,我在翻译这个 post 时可能漏掉了一些东西,所以“不要在家里尝试这个!”。谢谢
根据@Akina 的建议,可以使用视图以模块化方式在 MySQL 上工作。在我看来,视图是基于查询的动态表,可以作为独立查询或作为更大查询的组件,这使它们成为构建更大项目时非常有用的工具,并且非常容易实现。我不想在这里重现已经完成的内容,而是推荐以下教程:
https://www.mysqltutorial.org/create-sql-views-mysql.aspx 干杯!