2014-09-19 66 views
2

我有一個MySQL存儲過程返回多個結果集。見下面從MySQL程序獲取空結果集

` BEGIN                 /**/ 

     SELECT u.user_id, 
       u.user_name 
     FROM user u 
     UNION 
     SELECT 1,1 FROM DUAL WHERE FALSE; 

     SELECT g.group_id, 
       g.group_name 
     FROM group g 
     UNION 
     SELECT 1,1 FROM DUAL WHERE FALSE; 

     SELECT r.role_id, 
       r.role_name 
     FROM role r 
     UNION 
     SELECT 1,1 FROM DUAL WHERE FALSE; 

    END` 

在PHP,我算結果集在下面的方式處理

$rsCount = 1; 
     do { 
      $rowset = $stmt->fetchAll(PDO::FETCH_ASSOC); 
      if ($rowset) { 
       switch ($rsCount) { 
        case 1: //first resultset 
         $users = $rowset; 
         break; 
        case 2: //second resulset 
         $groups = $rowset; 
         break; 
        case 3: //third resultset 
         $roles = $rowset; 
         break; 
        default: 
         break; 
       } 
      } 

      $rsCount++; 
     } while ($stmt->nextRowset()); 

但是,如果組表是空的,則MySQL只返回2個結果集,它拋出我的PHP邏輯 - 是無論如何強迫MySQL返回一個空的結果集?是否有更好的PHP邏輯來處理這個問題 - 例如,我可以命名結果集並在PHP中檢查相同的結果嗎?

+1

如果沒有乾淨的做法,你總是可以將所有固定行聯合到查詢上,然後在PHP中忽略它。 – Laurence 2014-09-19 20:57:03

+0

我想基於其他反饋,但這不工作以及 - 'SELECT group_id FROM組UNION SELECT 1 FROM WHERE FALSE' - 是否有一些地方根據前一個查詢返回的行數選擇1? – ChicagoSky 2014-09-20 00:34:29

+0

您可以將存儲過程添加到帖子中。 – Bulat 2014-09-20 00:42:01

回答

0

我可以想像幾個技巧:

  • 總是添加一個虛擬行,並始終忽略的第一行:
SELECT NULL -- no further condition 
UNION ALL 
[actual query] ; 
  • LEFT JOIN實際查詢到虛擬表(但不要從虛擬表中選擇列)。結果集包含的NULL的一行如果實際查詢不會導致:
SELECT actualQuery.* 
FROM (SELECT NULL) AS dummy 
LEFT JOIN ([actual query]) AS actualQuery ON TRUE ; 

如果從[actual query]非空柱(例如主密鑰)是NULL,則該行是假和查詢沒有結果。