等同于“存在”

问题描述 投票:3回答:3

我是Propel的新手,已经在阅读文档。但是,我还没有找到与SQL中的EXISTS和NOT EXISTS构造完全相同的构造。例如,.NET中的Linq具有Any()。 [惯用] Propel中有以下等同项吗?

SELECT a.column1, a column2, a.etc
FROM   TableA a
WHERE  NOT EXISTS (SELECT 1
                   FROM   TableB b
                   WHERE  b.someIdColumn = a.someIdColumn
                   AND    b.aNullableDateColumn IS NULL)
php sql propel
3个回答
5
投票
EXISTS或NOT EXISTS之后是子查询。尽管这一事实似乎很明显,但最初并不是我将搜索重点放在子查询上的。我在该主题上找到了few resources。本质上,选项是使用JOIN重写查询(这是@Kaltas回答的核心)或使用Criteria::CUSTOM。我决定我可能更喜欢第二种选择,因为它允许我保留子查询,从而可能提高数据库性能。

然后,我做了很多关于Criteria::CUSTOM的阅读,但是真正帮助我的唯一阅读是阅读Propel 1.5来源。真的,这非常简单。只需将子查询,逐字记录(使用数据库的表和列名,

not Propel的对象名)以及EXISTS或NOT EXISTS放在where调用中,例如:

TableAQuery::create() ->where('NOT EXISTS (SELECT 1 FROM TableB WHERE TableA.someIdColumn = TableB.someIdColumn AND TableB.aNullableDateColumn IS NULL)') ->find(); 就这么简单。在内部,where方法通过几种可能性来解释该子句,并且找不到匹配项,它将该子句视为Criteria::CUSTOM的子句,并将其按原样插入SQL查询中。因此,例如,我不能使用表别名。

[如果有时间,也许我会采用一种更“ ORM式”的方法来完成此工作并提交补丁。不过,可能有人会击败我。

0
投票
SELECT a.column1, a.column2, a.etc FROM TableA a WHERE (SELECT COUNT(*) FROM TableB b WHERE b.someIdColumn = a.someIdColumn AND b.aNullableDateColumn IS NULL ) > 0

在Propel中很容易做到。

甚至在Propel中更干净,更容易实现:

SELECT a.column1, a.column2, a.etc FROM TableA a LEFT JOIN TableB b ON (b.someIdColumn = a.someIdColumn) WHERE b.aNullableDateColumn IS NULL AND b.primaryKeyColumn IS NOT NULL


0
投票
示例:选择不在用户组中的所有用户

$users = UserQuery::create()->filterById(UserPerUserGroupQuery::create()->select('user_id')->find(), CRITERIA::NOT_IN) ->orderByUserName() ->find();

© www.soinside.com 2019 - 2024. All rights reserved.