Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Doctrine] Dodatkowe zapytanie podczas użycia LIMIT
snapshot
post 5.01.2010, 23:22:32
Post #1





Grupa: Zarejestrowani
Postów: 96
Pomógł: 6
Dołączył: 22.08.2007
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Zauważyłem dzięki zf+firebug+firephp że gdy używam klauzuli LIMIT w zapytaniach doctrine (wersja 1.2.1) generuje mi dotatkowe zapytanie. Przykład stronicowania (adapter Doctrine w Zend_Paginator):

Wyciągam liczbę wszystkich elementów:

  1. SELECT COUNT(*) AS `num_results` FROM (SELECT `v`.`idvideo` FROM `video` `v` LEFT JOIN `user` `u` ON `v`.`iduser` = `u`.`iduser` LEFT JOIN `message` `m` ON `v`.`idvideo` = `m`.`idvideo` GROUP BY `v`.`idvideo`, `m`.`idvideo`) `dctrn_count_query`
Wyciągam 10 pierwszych wyników. Zamiast wyciągnąć dane to wyciąga tylko PK:
  1. SELECT DISTINCT `v2`.`idvideo` FROM `video` `v2` LEFT JOIN `user` `u2` ON `v2`.`iduser` = `u2`.`iduser` LEFT JOIN `message` `m2` ON `v2`.`idvideo` = `m2`.`idvideo` GROUP BY `v2`.`idvideo`, `m2`.`idvideo` ORDER BY `v2`.`idvideo` DESC LIMIT 10
Dopiero teraz wyciąga wszystkie dane na podstawie PK podając je w klauzuli WHERE:
  1. SELECT `v`.`idvideo` AS `v__idvideo`, `v`.`title` AS `v__title`, `u`.`iduser` AS `u__iduser`, `u`.`login` AS `u__login`, `m`.`idmessage` AS `m__idmessage`, COUNT(`m`.`idmessage`) AS `m__0`, IF(SUM(`m`.`iscorrect`) IS NULL, 0, SUM(`m`.`iscorrect`)) AS `m__1` FROM `video` `v` LEFT JOIN `user` `u` ON `v`.`iduser` = `u`.`iduser` LEFT JOIN `message` `m` ON `v`.`idvideo` = `m`.`idvideo` WHERE `v`.`idvideo` IN ('68', '67', '66', '65', '64', '63', '61', '60', '59', '58') GROUP BY `v`.`idvideo`, `m`.`idvideo` ORDER BY `v`.`idvideo` DESC NULL


 



--------------------
ZF developer
Go to the top of the page
+Quote Post
Crozin
post 5.01.2010, 23:46:24
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Zapewne baza danych to MySQL? Dzieje się tak ponieważ MySQL nie ma jeszcze zaimplementowanej obsługi LIMIT w podzapytaniach w skutek czego trzeba wykonać osobne zapytanie które skupia się wyłącznie na wybraniu ID rekordów, które będą miały być później zwrócone.

Chodzi o to, że Ty ustawiając limit na 10 w paginatorze(chyba źle to nazwałem) chcesz uzyskać 10 obiektów XYZ, a nie 10 rekordów z bazy. Wszystkie relacje sprawiają, że zwróconych rekordów może być np. 50, ale będą one reprezentować jedynie 10 rekordów XYZ wraz ich relacjami
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2024 - 14:30