【问题标题】:Doctrine Query calculate MAX value in WHERE clauseDoctrine Query 计算 WHERE 子句中的 MAX 值
【发布时间】:2011-12-19 15:35:57
【问题描述】:

我有这张桌子:

订阅者

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

【问题讨论】:

    标签: doctrine doctrine-1.2


    【解决方案1】:

    我认为最好的方法是使用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/

    【讨论】:

      【解决方案2】:

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

      1. subquery 中使用subscribers_years 表的型号名称
      2. 在查询中使用RAW SQL

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-28
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        相关资源
        最近更新 更多