我有一个包含以下列的表项:
我构建了一个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之后有几列,使用相同的语法!
你知道我的问题来自哪里吗? 谢谢! 的问候,
答案 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
)