【问题标题】:Return multiple result sets in MYSQL using stored procedure in Laravel使用 Laravel 中的存储过程在 MYSQL 中返回多个结果集
【发布时间】:2018-02-04 14:35:30
【问题描述】:

我执行了六次查询以返回多个结果集。所有呼叫的查询都相同,但参数仅有所不同。如下:

public function getGroupedInfo($id, $type, $zip,  $field) {

    return DB::table('data')
             ->select(DB::raw("{$field} as obj, COUNT(*) as count"))
             ->where('report_id', $id)
             ->where('book_section', $type)
             ->where('zip_code', $zip)
             ->groupBy("{$field}")
             ->orderBy('count', 'DESC')->get();

}

我调用函数如下:

public function stats(Request $request){
    $schools['Elementary Schools'] = $this->getGroupedInfo($id, $listing_type, $zip_code, 'elementary_school');
    $schools['Middle Schools'] = $this->getGroupedInfo($id, $listing_type, $zip_code, 'middle_school');
    $schools['High Schools'] = $this->getGroupedInfo($id, $listing_type, $zip_code, 'high_school');
    $others['lot_sqft'] = $this->getGroupedInfo($id, $listing_type, $zip_code, 'lot_sqft');
}

我打算将它们添加到单个存储过程中,但我不确定如何在单个存储过程中编写它们,然后在 Laravel 端使用结果。

你能帮我解决这个问题吗?提前致谢。

【问题讨论】:

    标签: php mysql stored-procedures laravel-5


    【解决方案1】:

    由于您总是查询相同四个字段的计数,因此您可以编写一个存储过程,其中包含使用UNION 连接的四个SELECT 语句,如下所示:

    CREATE PROCEDURE GetCounts
    (
        IN ReportId INT,
        IN ListingType VARCHAR(100),
        IN ZipCode INT
    )
    BEGIN
        SELECT 'elementary_school' AS type, elementary_school AS obj, COUNT(*) AS count
        FROM data
        WHERE report_id = @ReportId AND book_section = @ListingType AND zip_code = @ZipCode
        GROUP BY elementary_school
        ORDER BY count DESC
    
        UNION
    
        SELECT 'middle_school' AS type, middle_school AS obj, COUNT(*) AS count
        FROM data
        WHERE report_id = @ReportId AND book_section = @ListingType AND zip_code = @ZipCode
        GROUP BY middle_school
        ORDER BY count DESC
    
        UNION
    
        SELECT 'high_school' AS type, high_school AS obj, COUNT(*) AS count
        FROM data
        WHERE report_id = @ReportId AND book_section = @ListingType AND zip_code = @ZipCode
        GROUP BY high_school
        ORDER BY count DESC
    
        UNION
    
        SELECT 'lot_sqft' AS type, lot_sqft AS obj, COUNT(*) AS count
        FROM data
        WHERE report_id = @ReportId AND book_section = @ListingType AND zip_code = @ZipCode
        GROUP BY lot_sqft
        ORDER BY count DESC
    END;
    

    那么,你可以这样称呼它:

    DB::select('EXEC GetCounts(?,?,?)', array($id, $listing_type, $zip_code));
    

    【讨论】:

    • 太棒了!,就像一个魅力。您能否解释一下这种情况下的 UNION,它是如何工作的?
    • 它只是将每个选择的结果连接成一个结果。阅读此链接了解更多信息:dev.mysql.com/doc/refman/5.7/en/union.html
    • nice... 这让事情变得更容易理解了。谢谢汤姆。
    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2014-03-08
    • 2014-02-06
    相关资源
    最近更新 更多