2014-09-19 76 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,则该行是假和查询没有结果。