从MySQL过程中获取空结果集

时间:2014-09-19 20:47:56

标签: php mysql sql

我有一个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 个答案:

答案 0 :(得分: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,则该行为哑,且查询没有结果。