带子查询的PDOStatement查询返回空结果

时间:2013-12-09 10:32:00

标签: php postgresql pdo subquery pdostatement

我有以下PHP代码,这会产生一种奇怪的行为。该系统由PostgreSQL数据库支持,PHP版本为5.3.15。

    $sql = "SELECT ce.id FROM calendar_events AS ce
        WHERE ce.rowid = :rowid
        AND ((SELECT count(*) FROM calendar_events_attendees AS cea WHERE cea.event_id = ce.id AND cea.status <> 'D') > 0
            OR (SELECT count(*) FROM calendar_events_globalfnbl AS ceg WHERE ceg.event_id = ce.id AND ceg.status <> 'D') > 0)";

$stmt = db_prepare($sql); // Creates a PDOStatement
$stmt->bindValue(":rowid", $rowid, PDO::PARAM_INT);
$rv = $stmt->execute();

if($rv) {
    return $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
}
else {
    return null;
}

查询执行时没有错误,但函数返回一个空数组。在数据库中肯定会找到行,如果我在pgAdmin中执行查询(当然占位符替换为ID),它会返回我想要的行。

我设法发现子查询是问题所在。如果我将它们注释掉并使用以下查询,则返回行。但当然这也会返回我尝试使用子查询过滤掉的行。

$sql = "SELECT ce.id FROM calendar_events AS ce
        WHERE ce.rowid = :rowid";

PDO是否根本不支持这种类型的子查询,或者我的代码中找不到任何错误?

提前致谢!

2 个答案:

答案 0 :(得分:1)

我不了解您的框架,但您的COUNT(*) > 0子查询似乎等同于EXISTS (...)子查询(也可能更快,因为它们不必计算所有令人满意的元组)

SELECT ce.id 
FROM calendar_events AS ce
WHERE ce.rowid = :rowid
AND ( EXISTS (SELECT *
                FROM calendar_events_attendees AS exa
                WHERE exa.event_id = ce.id AND exa.status <> 'D'
                )
     OR EXISTS (SELECT * 
                FROM calendar_events_globalfnbl AS exg
                WHERE exg.event_id = ce.id AND exg.status <> 'D'
                )
        );

答案 1 :(得分:0)

这不是PDO的问题,而是我的代码本身。在仔细检查完再次调用上述函数的代码后,我发现了一些语句,在执行上述代码之前,将有关行的状态设置为“D”。

所以现在这个问题已经过时了,很抱歉浪费你们的时间!