2011-09-14 24 views
6

我正在开发与Symfony2中和学说的应用程序,并已被称为表状态在哪里存放地点和日期的书,如:如何只匹配Doctrine中最后更新的记录?

ID | Book  | Date  | Location 
------------------------------------------------ 
1 | Book_1  | 2011-08-29 | Home 
2 | Book_1  | 2011-08-30 | Office 
3 | Book_1  | 2011-09-02 | Friend's House 
4 | Book_2  | 2011-09-02 | Office 
5 | Book_2  | 2011-09-04 | Home 

与最近的日期的状态记录代表当前(或最后知道的)该书的位置。在上例中,Book_1目前位于“朋友之家”,Book_2位于“首页”。

以下代码获取任何记录,在某些时候有“家”的位置:

$em = $this->getEntityManager(); 
$query = $em->createQuery('SELECT s FROM myBookTestBundle:Status s WHERE s.location=:x')->setParameter('x', 'Home'); 
$status = $query->getResult(); 

相反,我想只选择那些书,其当前位置匹配“家” 。在上面的例子中,这只会记录ID = 5(Book_2)。

有没有什么办法可以用DQL轻松做到这一点?

任何帮助,非常感谢。

感谢,
拉尔夫

回答

2

另一个问题是: “Doctrine2的DQL可以处理子查询?”。

MySQL的查询是:

select ID,Book,`Date`,Location 
    from Status a 
    where `Date` = 
    (select max(`Date`) from Status group by Book having Book = a.Book) 
    and Location = 'Home'; 
2

感谢您的答复。我还发现了以下资源:http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html

而我能够将这种改编成以下DQL可以正常工作:

SELECT s1 FROM myBookTestBundle:Status s1 WHERE s1.Location=:location 
AND s1.Date=(SELECT MAX(s2.Date) FROM myBookTestBundle:Status s2 WHERE s1.Book=s2.Book) 

然而,根据上面的文章,这是更有效地使用一个不相关带有LEFT JOIN的子查询。但是,如果我尝试写入DQL等价物,则会出现错误。我在某个地方看过,该教义不支持FROM/JOIN语句中的子查询。

任何人都可以证实这一点吗?而且,有没有办法让上面的DQL尽可能高效?

再次感谢,
拉尔夫

相关问题