gpt4 book ai didi

php - 带有子查询的 PDOStatement 查询返回空结果

转载 作者:行者123 更新时间:2023-11-29 13:32:23 25 4
gpt4 key购买 nike

我有以下 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 是否根本不支持这种类型的子查询,或者我的代码中是否存在我找不到的错误?

提前致谢!

最佳答案

我不知道你的框架,但你的 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'
)
);

关于php - 带有子查询的 PDOStatement 查询返回空结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20468339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com