使用PDO输出分组结果

时间:2013-01-24 17:49:22

标签: php mysql loops pdo

我目前很难找到以我想要的方式显示PDO查询结果的方法。

我只是通过我自己设定的一项小任务来学习PHP / PDO和MySQL。我的选择查询如下。

try{
$sth=$dbh->prepare("SELECT backup.bakLoc, client.cliName, project.prjName, assistant.astName, session.sessDate, session.stdID, backup.bakID, backup.bakName, backup.bakDate, backup.bakKeep, backup.recLoc, backup.bakDeleted
                    FROM session
                    INNER JOIN studio ON session.stdID=studio.stdID
                    INNER JOIN engineer ON session.engID=engineer.engID
                    INNER JOIN assistant ON session.astID=assistant.astID
                    INNER JOIN client ON session.cliID=client.cliID
                    INNER JOIN project ON session.prjID=project.prjID
                    INNER JOIN composer ON session.cmpID=composer.cmpID
                    INNER JOIN fixer ON session.fixID=fixer.fixID
                    LEFT JOIN backup ON session.bakID=backup.bakID
                    WHERE session.stdID = :stdID AND (ISNULL(backup.bakDeleted) OR backup.bakDeleted =0)
                    ORDER BY session.stdID,backup.bakLoc,sessDate; ");

 $sth->bindParam(':stdID', $_GET['studio'], PDO::PARAM_INT);

 $sth->execute();



}
catch(PDOException $e) {
   print $e->getMessage();
}

我遇到的问题与输出此查询结果的方式有关。

id喜欢通过backup.bakLoc列对输出进行分组。该列可以有四个结果之一,NULL,1,2或3.我想将此输出到html,每个结果集都有一个单独的标题,而不是设置4个带有不同子句的查询。为了在过去完成它,我最终将每个列转储到它自己的数组中,然后使用几个if语句迭代输出以监视列值更改或仅在WHERE子句更改的每个标题下运行查询。必须有一种更直接的方式。

所以在这样的页面上

<h1>Not Backed Up</h1>
    //all results of when $row['bakLoc'] is NULL or 0
<?=$row['bakName']; ?><br />

<h1>backup location 1</h1>
   //all results of when $row['bakLoc'] is 1
<?=$row['bakName']; ?><br />

等等

我一直在玩PDO :: FETCH_GROUP,但我无法按照我的意愿去工作。我希望有人可以指出我正确的方向来分割这样的结果而不需要多个查询。 (当然,除非多次查询是最佳方式。)

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您要查找每次出现的backup.bakLoc的计数,这将为您提供一条记录,其中包含4个backLoc值中的每一个的计数:

SELECT  SUM(CASE WHEN backup.bakLoc IS NULL THEN 1 ELSE 0 END) backLoc_null,
        SUM(CASE WHEN backup.bakLoc = 1 THEN 1 ELSE 0 END) backLoc_1,
        SUM(CASE WHEN backup.bakLoc = 2 THEN 1 ELSE 0 END) backLoc_2,
        SUM(CASE WHEN backup.bakLoc = 3 THEN 1 ELSE 0 END) backLoc_3

<the rest of your query>