2011-09-14 2 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은 현재 "Friend 's House"에 있고 Book_2는 "Home"에 있습니다.

은 다음 코드는 어떤 점에서 "홈"의 위치했다 어떤 레코드를 가져옵니다 대신

$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에 상응하는 내용을 쓰려고하면 오류가 발생합니다. 나는 Doctrine이 FROM/JOIN 문에서 하위 쿼리를 지원하지 않는다는 것을 읽을 수있다.

누구든지 확인할 수 있습니까? 그리고 위의 DQL을 최대한 효율적으로 만들 수있는 방법이 있습니까?

다시 한 번 감사드립니다.
랄프

관련 문제