Sumowanie wartości kolumn z różnych tabel przy pomocy mechanizmu JDatabase
Wyniki 1 do 3 z 3

Temat: Sumowanie wartości kolumn z różnych tabel przy pomocy mechanizmu JDatabase

  1. #1
    Debiutant
    Dołączył
    14-04-2009
    Wpisy
    7
    Punkty
    11

    Joomla! 3.6 Sumowanie wartości kolumn z różnych tabel przy pomocy mechanizmu JDatabase

    Cześć,

    od pewnego czasu korzystam z Fabrika. Świetne narzędzie, przy jego pomocy tworzę rozmaite listy i zestawienia. Ponieważ ich prezentacja przez mechanizmy Fabrika jest dość uboga, postanowiłem samemu tworzyć zestawienia (dzięki Sourcererowi) z użyciem joomlowego mechanizmy JDatabase. Wszystko szło mi świetnie, zrobiłem do tej pory masę raportów, aż nagle potknąłem się na problemie, o którym w życiu bym nie pomyślał, że będzie taką zagwozdką.

    Załóżmy, że mam trzy proste tabele (tabela1, tabela2, tabela3) o identycznej budowie - każda posiada kolumny: 'ID', 'data', 'tytul', 'udostepnianie'. W tych tabelach odnotowywane są statystyki udostępnień bibliotecznych czasopism (czyli jakiego dnia, jaki tytuł i ile razy udostępniono). Podsumowanie liczby wypożyczeń dla każdej z tabel z osobna (każda tabela reprezentuje inną agendę) to żaden problem. Problemem za to (przynajmniej dla mnie) jest zsumowanie w jednej tabeli liczby wszystkich udostępnień z wszystkich tabel.

    Naprawdę siedzę nad tym i siedzę i nie chce mi to zadziałać. Na wszystkie sposoby starałem się zmusić do pracy 'unionAll' (zgodnie z dokumentacją), żeby połączyć wszystkie tabele i je zsumować, ale za każdym razem fiasko - najczęściej otrzymuję komunikat 'Call to a member function select() on null'.

    Może mi ktoś wskazać, co jest nie tak z tym zapytaniem?

    $query = $db->getQuery(true);
    $q2->select('data, sum(udostepnianie) as sumtab');
    $q2->from('tabela2');
    $q2->where($db->quoteName('data').'LIKE \'2015%\'');
    $q3->select('data, sum(udostepnianie) as sumtab');
    $q3->from('tabela3');
    $q3->where($db->quoteName('data').'LIKE \'2015%\'');
    $query->select('data, sum(udostepnianie) as sumtab');
    $query->from('tabela1');
    $query->where($db->quoteName('data').'LIKE \'2015%\'');
    $query->unionAll($q2);
    $query->unionAll($q3);
    $query->group('substr(data,1,4)');
    $db->setQuery($query);
    $result = $db->loadObjectList();

    Na wszelki wypadek zaznaczam, że żaden ze mnie orzeł bazodanowy.

    Z góry dziękuję za pomoc

  2. Pani Reklamowa
    Pani Reklamowa jest aktywna
    Avatar Panny Google

    Dołączył
    19-08-2010
    Skąd
    Internet
    Postów
    milion
    Pochwał
    setki
  3. #2
    Debiutant
    Dołączył
    14-04-2009
    Wpisy
    7
    Punkty
    11

    Domyślny

    Uff, udało mi się rozwiązać problem (podejrzałem w pliku /administrator/components/com_finder/helpers/indexer/query.php. Działające zapytanie ma postać:

    $query = $db->getQuery(true);
    $query->select('data, sum(udostepnianie) as sumtab');
    $query->from('tabela1');
    $query->where($db->quoteName('data').'LIKE \'2015%\'');
    $sub = clone $query;
    $sub->clear('from');
    $sub->from('tabela2');
    $sub2 = clone $query;
    $sub2->clear('from');
    $sub2->from('tabela3');
    $query->union($sub);
    $query->union($sub2);
    $db->setQuery($query);
    $result = $db->loadObjectList();

    Rozwiązanie nie jest doskonałe, bo dla każdej ze składowych tabel generuje osobną sumę, więc jest tyle zwróconych wartości, ile tabel. Sumowania tych wartości dokonałem już w PHP na poziomie tabeli z prezentacją wyników. Grunt, że działa. Jeśli ktoś zna bardziej eleganckie rozwiązanie tego problemu, to może się podzieli?...

  4. #3
    Debiutant
    Dołączył
    14-04-2009
    Wpisy
    7
    Punkty
    11

    Domyślny

    Update! Dopracowałem zapytanie i teraz ładnie czesze wszystkie 3 tabele i zwraca jedną wartość (sumę):

    $query1 = $db->getQuery(true)->select('*')->from('tabela1')->where($db->quoteName('data').'LIKE \'2015%\'');
    $query2 = $db->getQuery(true)->select('*')->from('tabela2')->where($db->quoteName('data').'LIKE \'2015%\'');
    $query3 = $db->getQuery(true)->select('*')->from('tabela3')->where($db->quoteName('data').'LIKE \'2015%\'');
    $query = $db->getQuery(true)->select('data, sum(case when substr(data,1,4)=\'2015\' then udostepnienia else null end) as sumtab')->from('(' . $query1->union($query2)->union($query3) . ') tx');
    $db->setQuery($query);
    $result = $db->loadObjectList();

    Warunek w 'select' wziął się stąd, że docelowe zapytanie będzie obejmowało podział udostępnień na przestrzeni kilku lat.

    Może się to wszystko komuś jeszcze kiedyś przyda :-)

Podobne tematy

  1. Fabrik - niedozwolona wartość w liście wyboru (wykluczenie jednej wartości)
    przez max-301 na forum Rozszerzenia - problemy z obsługą, zarządzaniem
    Odpowiedzi: 1
    Ostatni post/autor: 13-02-2013, 13:56
  2. JDatabase - pobieranie nazwy kolumny
    przez Robster na forum Programowanie pod Joomla!
    Odpowiedzi: 2
    Ostatni post/autor: 20-04-2012, 19:06
  3. Joomleague sumowanie wydarzeń
    przez jooni22 na forum Rozszerzenia - problemy z obsługą, zarządzaniem
    Odpowiedzi: 3
    Ostatni post/autor: 07-10-2011, 11:28
  4. Błąd joomla.library:2006 JDatabase::getInstance
    przez cugok na forum Administracja - ogólne
    Odpowiedzi: 0
    Ostatni post/autor: 16-05-2010, 21:12
  5. Sumowanie wybranych opcji czyli kalkulator ale trochę inny...
    przez allegropower na forum Wydajność, optymalizacja
    Odpowiedzi: 3
    Ostatni post/autor: 08-05-2010, 03:01

Reguły pisania

  • Nie możesz zakładać nowych tematów
  • Nie możesz dodawać wypowiedzi
  • Nie możesz dodawać załączników
  • Nie możesz poprawiać swoich postów
  •