我有以下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是否根本不支持这种类型的子查询,或者我的代码中找不到任何错误?
提前致谢!
答案 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”。
所以现在这个问题已经过时了,很抱歉浪费你们的时间!