选择上一个值学说查询

时间:2016-03-04 14:54:30

标签: php mysql symfony doctrine-orm

我的表看起来像这样

id  |  name   | revision_number | form_key | locked
---------------------------------------------------
1   |  Name1  |        1        |   abcd   |  true
2   |  Name2  |        1        |   efgh   |  false
3   |  Name1  |        2        |   abcd   |  true
4   |  Name2  |        2        |   efgh   |  true
5   |  Name2  |        3        |   efgh   |  true

现在我想获取最后锁定的表单,基于form_key,所以在这种情况下,id = 3和name = Name1的那个以及id = 5且name = Name2

的表单

这是我目前的查询

$revisionQuery =$em->getRepository('AppBundle:Form')->createQueryBuilder('f')
->select('f')

->where('f.lockBit = :locked')

->andWhere('f.revisionNumber = (SELECT MAX(f2.revisionNumber) FROM AppBundle:Form f2 WHERE f.formKey = f2.formKey GROUP BY f2.formKey)')

->setParameters(['locked' => true]);

但这并没有给我我想要的结果。

1 个答案:

答案 0 :(得分:1)

我为你提供了SQL来做到这一点。我认为你需要一个Native DQL for Doctrine

SELECT
    f.id,
    f.`name`,
    f.revision_number,
    f.form_key
FROM
    form f
INNER JOIN (
    SELECT
        max(ff.revision_number) AS revision,
        ff.form_key
    FROM
        form ff
    GROUP BY
        ff.form_key
) tt ON f.form_key = tt.form_key
AND f.revision_number = tt.revision

希望这对你有所帮助。