在 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 干杯!