Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Doctrine] Dodatkowe zapytanie podczas użycia LIMIT
Forum PHP.pl > Forum > Gotowe rozwiązania > Skrypty obsługi baz danych
snapshot
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


 

Crozin
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.