2015-12-21 32 views
0

我已經存儲在數據庫中的過程結果:得到存儲過程的MySQL PHP在HTML表

DELIMITER $$ 

USE `billing`$$ 

DROP PROCEDURE IF EXISTS `Pivot`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `Pivot`(
    IN tbl_name VARCHAR(99),  -- table name (or db.tbl) 
    IN base_cols VARCHAR(99),  -- column(s) on the left, separated by commas 
    IN pivot_col VARCHAR(64),  -- name of column to put across the top 
    IN tally_col VARCHAR(64),  -- name of column to SUM up 
    IN where_clause VARCHAR(99), -- empty string or "WHERE ..." 
    IN order_by VARCHAR(99)  -- empty string or "ORDER BY ..."; usually the base_cols 
    ) 
    DETERMINISTIC 
    SQL SECURITY INVOKER 
BEGIN 
    -- Find the distinct values 
    -- Build the SUM()s 
    SET @subq = CONCAT('SELECT DISTINCT ', pivot_col, ' AS val ', 
        ' FROM ', tbl_name, ' ', where_clause, ' ORDER BY 1'); 
    -- select @subq; 
    SET @cc1 = "CONCAT('SUM(IF(&p = ', &v, ', &t, 0)) AS ', &v)"; 
    SET @cc2 = REPLACE(@cc1, '&p', pivot_col); 
    SET @cc3 = REPLACE(@cc2, '&t', tally_col); 
    -- select @cc2, @cc3; 
    SET @qval = CONCAT("'\"', val, '\"'"); 
    -- select @qval; 
    SET @cc4 = REPLACE(@cc3, '&v', @qval); 
    -- select @cc4; 
    SET SESSION group_concat_max_len = 10000; -- just in case 
    SET @stmt = CONCAT(
      'SELECT GROUP_CONCAT(', @cc4, ' SEPARATOR ",\n") INTO @sums', 
      ' FROM (', @subq, ') AS top'); 
    SELECT @stmt; 
    PREPARE _sql FROM @stmt; 
    EXECUTE _sql;      -- Intermediate step: build SQL for columns 
    DEALLOCATE PREPARE _sql; 
    -- Construct the query and perform it 
    SET @stmt2 = CONCAT(
      'SELECT ', 
       base_cols, ',\n', 
       @sums, 
       ',\n SUM(', tally_col, ') AS Total' 
      '\n FROM ', tbl_name, ' ', 
      where_clause, 
      ' GROUP BY ', base_cols, 
      '\n WITH ROLLUP', 
      '\n', order_by 
     ); 
    SELECT @stmt2;     -- The statement that generates the result 
    PREPARE _sql FROM @stmt2; 
    EXECUTE _sql;      -- The resulting pivot table ouput 
    DEALLOCATE PREPARE _sql; 
    -- For debugging/tweaking, SELECT the various @variables after CALLing. 
END$$ 

DELIMITER ; 

當我通過一個SQL語句,我想捕捉與列標題行的最終結果,並把它傳遞給PHP上的HTML表格輸出。

CALL樞軸( '生產', 'PRODUCT_NAME', '市場', 'forcast_qty', \ 「WHERE production_date = '2015年12月31日' \」, '');

到目前爲止,當我編碼以下過程來獲得輸出我得到一個數組,但不是存儲過程的最終結果。

if(isset($_POST['planned_forecast'])) 
{ 
if(isset($_POST['production_date'])){ $date_prod = $_POST['production_date']; } 
$stmt = $DB_con->prepare("CALL Pivot('production', 'product_name', 'market', 'forcast_qty', \"WHERE production_date = '2015-12-31'\", '');"); 
$stmt->execute(); 
while ($row = $stmt->fetchAll(PDO::FETCH_ASSOC)) 
{ 
print_r($row); 
} 
echo ' 
<thead>'; 
    echo ' 
</thead> 
'; 
echo ' 
<tbody> 
    '; 
    echo ' 
    <tr> 
     '; 
     echo ' 
     <td></td> 
     '; 
     echo ' 
    </tr> 
    '; 
    echo ' 
</tbody> 
'; 
echo '</table>'; 
echo '<input hidden="true" name="date_prod" type="text" value="'.$date_prod.'"/>'; 
echo '<button type="submit" class="btn btn-default waves-effect waves-light" name="btn-editforcast" id="btn-editforcast">Update</button>'; 
} 

結果:

陣列([0] =>數組([@stmt] => SELECT GROUP_CONCAT(CONCAT( 'SUM(IF(市場=', ''「,VAL ,'',',forcast_qty, 0))AS',''',val,'「')SEPARATOR」,「)INTO @sums FROM(SELECT DISTINCT market AS val FROM production WHERE production_date = '2015 -12-31'ORDER BY 1)AS頂部))

enter image description here

回答

1

我認爲你可以簡化存儲過程和使用這樣的:

DELIMITER $$ 

USE `billing`$$ 

DROP PROCEDURE IF EXISTS `Pivot`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `Pivot`(
    IN tbl_name VARCHAR(99),  -- table name (or db.tbl) 
    IN base_cols VARCHAR(99),  -- column(s) on the left, separated by commas 
    IN pivot_col VARCHAR(64),  -- name of column to put across the top 
    IN tally_col VARCHAR(64),  -- name of column to SUM up 
    IN where_clause VARCHAR(99), -- empty string or "WHERE ..." 
    IN order_by VARCHAR(99)  -- empty string or "ORDER BY ..."; usually the base_cols 
    ) 
    DETERMINISTIC 
    SQL SECURITY INVOKER 
BEGIN 

    -- Prepare the "pivot" part of the query 
    SET @stmt = CONCAT(

     "SELECT GROUP_CONCAT(\" SUM(\" ", 
     "     \" CASE WHEN ", pivot_col, "='\", ", pivot_col, ", \"'\" ", 
     "     \"   THEN ", tally_col, "\" ", 
     "     \"   ELSE 0\" ", 
     "     \" END\" ", 
     "     \") AS '\", ", pivot_col, ", \"'\n\") as stmt FROM (select distinct ", pivot_col, " FROM ", tbl_name, ") A INTO @sum_clause"  
    ); 


    PREPARE _sql FROM @stmt; 
    EXECUTE _sql;      
    DEALLOCATE PREPARE _sql; 

     -- Prepare and execute the query itself 
    SET @stmt = CONCAT(
     "SELECT ", base_cols, ", ", 
     @sum_clause, 
     ", SUM(", tally_col, ") as 'Total qty'" 
     " FROM ", tbl_name, " \n" , 
     where_clause, "\n", 
     " GROUP BY ", base_cols 
     ); 

    PREPARE _sql FROM @stmt; 
    EXECUTE _sql;      
    DEALLOCATE PREPARE _sql; 

END$$ 

DELIMITER ; 

我不能保證它適用於所有情況,但它爲您所使用的參數你例如,併產生與原始問題中相同的結果。

+0

它沒有工作.. :(我正在尋找獲得程序的最終結果的輸出並將其填充到php html tabe –

+1

讓我們從檢查存儲過程本身開始 如果手動調用存儲過程,它會返回正確的結果嗎?還是返回不正確的結果?一個錯誤?沒有什麼? –

+0

它給出了正確的結果讓我更新和分享截圖 –