Doctrine 条令查询计算WHERE子句中的最大值

Doctrine 条令查询计算WHERE子句中的最大值,doctrine,doctrine-1.2,Doctrine,Doctrine 1.2,我有以下表格: 订户 订户十年 subscriber_id | year | --------------+-------+ 1 | 2009 | 1 | 2010 | 1 | 2011 | 2 | 2009 | 2 | 2010 | 3 | 2010 | 我想只使用最大值为x的记录进行高级搜索。 如果x=2010 结果查询必须是:Sam

我有以下表格:

订户

订户十年

subscriber_id | year  |
--------------+-------+
1             | 2009  |
1             | 2010  |
1             | 2011  |
2             | 2009  |
2             | 2010  |
3             | 2010  |
我想只使用最大值为x的记录进行高级搜索。 如果x=2010 结果查询必须是:Sam和Joe

我试试这个:

$query = $this->createQuery('su')
            ->select('su.id, su.name)
            ->addWhere(
                '(SELECT MAX(year) AS maxYear FROM `subscribers_years` WHERE `subscriber_id`=`su.id`) = ?',
                2010
            );
但是我有一个错误消息:消息:找不到类
订阅者\u年

我应该如何正确地编写查询


解决方案
我的错误是我没有使用类名原则作为From,而是使用了表mysql的名称!:S

在条令子查询中不能使用纯SQL。你有两个选择:

  • 在您的应用程序中,使用
    订户\u年
    表的型号名称
  • 在查询中使用
  • 如果您不需要任何高级SQL,我会选择选项1,因为它的SQL更少,并且您不需要指定连接条件,否则您应该使用2


    如果没有,您可以随时为您的
    订阅者添加一个条令类。

    我认为最好的方法是使用
    createSubquery()
    明确地告诉条令关于子查询,然后将其嵌套到where条件中。该模式非常简单,可以用于任何复杂的情况。然后,您的查询应该如下所示:

    $query = $this->createQuery('su')
        ->select('su.id, su.name)
    ;
    
    $subquery = $query->createSubquery()
        ->select("MAX(year) AS maxYear")
        ->from("SubscriberYear")
        ->where("subscriber_id=su.id")
    ;
    
    $query->addWhere($subquery->getDql().' = ?', 2010 );
    
    下面是创建子查询的另一个示例:

    $query->addWhere('(SELECT MAX(year) AS maxYear FROM SubscriberYear WHERE subscriber_id=su.id) = ?', 2010 );
    
    $query = $this->createQuery('su')
        ->select('su.id, su.name)
    ;
    
    $subquery = $query->createSubquery()
        ->select("MAX(year) AS maxYear")
        ->from("SubscriberYear")
        ->where("subscriber_id=su.id")
    ;
    
    $query->addWhere($subquery->getDql().' = ?', 2010 );