我有这张表:
订户
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
答案 0 :(得分:2)
您的学说子查询中不能使用纯SQL。你有两个选择:
答案 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/