2011-09-14 20 views
6

Tôi đang phát triển một ứng dụng với Symfony2 và Doctrine, và có một bảng gọi là tình trạng nơi tôi lưu trữ các địa điểm và ngày cuốn sách, chẳng hạn như:Làm cách nào để chỉ khớp các bản ghi được cập nhật lần cuối trong Học thuyết?

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 

Kỷ lục trạng thái với ngày gần đây nhất đại diện cho hiện tại (hoặc vị trí cuối cùng) của cuốn sách đó. Trong ví dụ trên, Book_1 hiện nằm trong "Friend's House" và Book_2 nằm trong "Home".

Các mã sau đây được bất kỳ hồ sơ mà tại một số điểm đã có một vị trí của "Home":

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

Thay vào đó, tôi muốn chỉ chọn những cuốn sách mà hiện vị trí phù hợp với "Home" . Trong ví dụ trên, đó sẽ chỉ là bản ghi ID = 5 (Book_2).

Có cách nào để thực hiện điều này dễ dàng với DQL không?

Bất kỳ trợ giúp nào được đánh giá cao.

Cảm ơn,
Ralph

Trả lời

2

Một câu hỏi khác là: "DQL Doctrine2 của thể xử lý subselects?".

Truy vấn cho MySQL sẽ là:

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

Cảm ơn trả lời của bạn. Tôi cũng tìm thấy các tài nguyên sau: http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html

Và tôi đã có thể thích ứng này vào DQL sau đó hoạt động đúng:

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) 

Tuy nhiên, theo bài viết ở trên, đó là hiệu quả hơn để sử dụng một không tương quan truy vấn phụ với một LEFT JOIN. Nhưng nếu tôi cố gắng viết DQL tương đương, tôi nhận được một lỗi. Tôi đọc ở đâu đó rằng Doctrine không hỗ trợ các truy vấn phụ trong các câu lệnh FROM/JOIN.

Có ai có thể xác nhận điều này không? Và, có cách nào để làm cho DQL ở trên hiệu quả nhất có thể không?

Xin cảm ơn một lần nữa,
Ralph

Các vấn đề liên quan