首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理论查询计算WHERE子句中的最大值

理论查询计算WHERE子句中的最大值
EN

Stack Overflow用户
提问于 2011-12-19 15:35:57
回答 2查看 7.9K关注 0票数 3

我有这张桌子:

订户

代码语言:javascript
复制
id | name  |
---+-------+
1  | Hill  |
2  | Sam   |
3  | Joe   |

subscribers_years

代码语言:javascript
复制
subscriber_id | year  |
--------------+-------+
1             | 2009  |
1             | 2010  |
1             | 2011  |
2             | 2009  |
2             | 2010  |
3             | 2010  |

我想使用最高值为x的记录进行高级搜索。如果x= 2010结果查询必须是: Sam和Joe!

我试试看:

代码语言:javascript
复制
$query = $this->createQuery('su')
            ->select('su.id, su.name)
            ->addWhere(
                '(SELECT MAX(year) AS maxYear FROM `subscribers_years` WHERE `subscriber_id`=`su.id`) = ?',
                2010
            );

但是我有一个消息错误: Message:未能找到类subscribers_years

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

解决方案

代码语言:javascript
复制
$query->addWhere('(SELECT MAX(year) AS maxYear FROM SubscriberYear WHERE subscriber_id=su.id) = ?', 2010 );

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-19 16:48:08

您不能在原则子查询中使用普通SQL。你有两个选择:

  1. subscribers_years中使用子查询表的模型名
  2. 在查询中使用原始SQL

如果您不需要任何高级SQL,我将选择选项1,因为它的SQL较少,而且不需要指定联接条件,否则应该使用2。

如果您没有subscribers_years,那么始终可以为它添加一个Doctrine类。

票数 1
EN

Stack Overflow用户

发布于 2012-09-01 07:02:42

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

代码语言:javascript
复制
$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 );

下面是另一个创建Subqueries的示例:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8563614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档