SF2 - Doctrine DQL - 选择多个列

时间:2013-12-04 12:29:00

标签: php sql symfony doctrine-orm doctrine

我有一个包含以下列的表项:

  • 编号
  • 分类
  • 日期

我构建了一个SQL请求,它返回每个类别的最新日期的所有行:

SELECT *
FROM item i
WHERE (i.category, i.date) IN (SELECT category, MAX(date)
                               FROM item
                               GROUP BY category)

这样可以正常工作并返回我需要的东西。

我使用Symfony2和Doctrine,所以我更喜欢使用DQL(甚至更好:QueryBuilder)而不是NativeSQL。

所以这是我的DQL请求:

SELECT i
FROM MyBundle:Item i
WHERE (i.category, i.date) IN (SELECT i2.category, MAX(i2.date) 
                               FROM MyBundle:Item i2
                               GROUP BY i2.category
                               )

这给了我错误:

QueryException: [Syntax Error] line 0, col 103: Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got ','

如果我删除前两个括号,我会得到:

QueryException: [Syntax Error] line 0, col 102: Error: Expected =, <, <=, <>, >, >=, !=, got ','

我认为WHERE存在问题,所以我尝试了以下内容,看看会发生什么:

SELECT i
FROM MyBundle:Item i
WHERE i IN (SELECT i2.category, MAX(i2.date) 
            FROM MyBundle:Item i2
            GROUP BY i2.category
            )

我明白了:

QueryException: [Syntax Error] line 0, col 116: Error: Expected Doctrine\ORM\Query\Lexer::T_FROM, got ','  

但是在教义文档中,there is an example在SELECT之后有几列,使用相同的语法!

你知道我的问题来自哪里吗? 谢谢! 的问候,

2 个答案:

答案 0 :(得分:0)

您需要将查询的条件语句分开;这是因为DQL无法解析以逗号分隔的字段名(i.category, i.date)

SELECT 
  i 
FROM 
  MyBundle:Item i 
WHERE
  i.category IN ( (SELECT i2.category FROM MyBundle:Item i2 GROUP BY i2.specy) )
AND
  i.date IN ( (SELECT MAX(i2.date) FROM MyBundle:Item i2 GROUP BY i2.specy) )

我还建议使用括号()来包装任何子查询。

答案 1 :(得分:0)

您可以使用exists

SELECT 
  i 
FROM 
  MyBundle:Item i 
WHERE
  EXISTS (
    SELECT i2 
    FROM MyBundle:Item i2
    WHERE i2.category = i.category
    GROUP BY i2.category
    HAVING MAX(i2.date) = i.date
  )