Doctrine Query在WHERE子句中计算MAX值

时间:2011-12-19 15:35:57

标签: doctrine doctrine-1.2

我有这张表:

订户

id | name  |
---+-------+
1  | Hill  |
2  | Sam   |
3  | Joe   |

subscribers_years

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
            );

但是我有消息错误:消息:找不到类subscribers_years

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


解决方案

$query->addWhere('(SELECT MAX(year) AS maxYear FROM SubscriberYear WHERE subscriber_id=su.id) = ?', 2010 );

我的错误是我没有使用类名Doctrine作为From,而是使用了表mysql的名称! :S

2 个答案:

答案 0 :(得分:2)

您的学说子查询中不能使用纯SQL。你有两个选择:

  1. subquery
  2. 中使用subscribers_years表的型号名称
  3. 在查询中使用RAW SQL
  4. 如果您不需要任何高级SQL,我会使用选项1,因为它具有较少的SQL而您不需要指定连接条件,否则您应该使用2。

    如果您没有subscribers_years,可以随时添加一个Doctrine类。

答案 1 :(得分: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 );

以下是创建子查询的另一个示例:

http://www.philipphoffmann.de/2012/08/taming-doctrine-subqueries/