Topic: Užklausa iš trijų lentelių

Sveiki,

Turime mokėjimų sistemos DB, kurią sudaro 3 lentelės:

Klientai (kaupiama informacija apie klientus)

Sąskaitos (išrašomos sąskaitos kiekvieną mėnesį)

Mokėjimai (importuojami banko išrašai)

Reikia vienoje lentelėje atvaizduoti laukus:

Mokėtojo kodas, Vardas, Pavardė, Abonentinis mokestis, įmokos už praėjusį mėnesį SUMOJE, praeito mėnesio sąskaitos suma.

Darom užklausą:

 $menesiukas=date("Y-m", strtotime("-1 month") );   
                                        
        $sql="SELECT klientai.mok_kod, klientai.vard , klientai.pav ,
                  klientai.ab_mok,SUM(mokejimai.suma) AS sumoketa, saskaitos.suma
                  FROM klientai 
                  JOIN saskaitos ON klientai.mok_kod = saskaitos.mok_kod
                  JOIN mokejimai ON klientai.mok_kod = mokejimai.mok_kod
                  WHERE saskaitos.data LIKE '$menesiukas%' 
                  GROUP BY klientai.mok_kod
                  ORDER BY klientai.mok_kod
                  
";

Gražina visą teisingą informaciją išskyrus apmokėjimus už praėjusį mėnesį sumoje.

Tai yra tikriausiai todėl, kad nenurodytas įmokų mėnesis užklausoje, tačiau jeigu padarome taip:

 $menesiukas=date("Y-m", strtotime("-1 month") );   
                                        
        $sql="SELECT klientai.mok_kod, klientai.vard , klientai.pav ,
                  klientai.ab_mok,SUM(mokejimai.suma) AS sumoketa, saskaitos.suma
                  FROM klientai 
                  JOIN saskaitos ON klientai.mok_kod = saskaitos.mok_kod
                  JOIN mokejimai ON klientai.mok_kod = mokejimai.mok_kod
                  WHERE saskaitos.data LIKE '$menesiukas%' 
                  AND mokejimai.data LIKE '$menesiukas%'   
                  GROUP BY klientai.mok_kod
                  ORDER BY klientai.mok_kod
                  
";

Negauname norimo rezultato.

Kaip pakoreguoti užklausą, kad šalia kitų laukų būtų gautą įmokų už praėjusį mėnesį su kiekvienu klientu.


Iš anksto dėkoju už pagalbą.

Re: Užklausa iš trijų lentelių

Pamiršau paminėti, kad užklausa turi gražinti ir tuos klientus, kurie praėjusį mėnesį nepadarė nei vienos įmokos.

3 (edited by Ajaks 2012-10-05 12:59:23)

Re: Užklausa iš trijų lentelių

Pora itarimu kyla:

WHERE saskaitos.data LIKE '$menesiukas%'

LIKE siuo atveju nelabai maloniai skamba.

Del sumos nerodymo, problema turbut del GROUP BY. Galima zaisti su SQL, o gal galima suma apskaiciuot PHP?

Jeigu reikia visu klientu, tai reik daryti LEFT JOIN

Re: Užklausa iš trijų lentelių

Dėkoju - pabandysiu.

Like naudoju todėl, kad sąskaitos, bei mokėjimai įvedami naudojant pilną datą pvz.: 2012.12.12

O atrinkti reikia tik mėnesį.

Re: Užklausa iš trijų lentelių

Užduotį skaidyk į smulkesnes dalis. Pabandyk atskirai gauti kiekvieno kliento kasmėnesinę sumą. Paskui galėsi prijungti likusią reikalingą informaciją.

Re: Užklausa iš trijų lentelių

kas dėl LIKE naudojimo datos atfiltravimui, tai tikrai taip nerekomenduotina daryt. Nebent čia kokia labai maža, nerimta sistema. Geriau iš karto metai+mėnesis saugoti atskirame stulpelyje, kuris būtų indeksuojamas ir jame tada galėsi ieškoti su WHERE metai_menesis = ...

Re: Užklausa iš trijų lentelių

mcxlan wrote:

Dėkoju - pabandysiu.

Like naudoju todėl, kad sąskaitos, bei mokėjimai įvedami naudojant pilną datą pvz.: 2012.12.12

O atrinkti reikia tik mėnesį.

http://dev.mysql.com/doc/refman/5.1/en/ … tion_month

Re: Užklausa iš trijų lentelių

Ajaks wrote:
mcxlan wrote:

O atrinkti reikia tik mėnesį.

http://dev.mysql.com/doc/refman/5.1/en/ … tion_month

Gi netinka TIK mėnesis, nes reikia ir metų, kad nebūtų klaidos, kai išrenkamas tas pats mėnesis iš skirtingų metų.

Todėl reikia:
a) arba ir MONTH() ir YEAR() funkcijų
b) STRING tipo laukas, kur saugoma kažkas panašaus: "2012-10";

Pirmu atveju veikia gražus ir aiškus SQL'as, bet yra minusas, kad kas kartą sukant tą SQL'ą, visi tos lentelės įrašai yra bružinami per minėtas dvi funkcijas. Turint tokių įrašų DAUG greitai pasimatys, kad tai nėra labai efektyvu.

Daug efektyviau saugoti reikiamą info atskirame stulpelyje, kur jau jokių funkcijų nereikia naudoti, o iš karto atlikti paiešką indekse: WHERE met_men = $....

Galima saugoti dviejuose stulpeliuose, atskirai metus ir mėnesius, tada galima naudoti INT tipus.

Geriausia autoriui išsibandyti ir paeksperimentuoti, kas geriau veikia:
1) STRING tipo stulpelis "2012-10-10"; paieška su "LIKE";
2) DATE tipo stulpelis; paieška su MONTH() ir YEAR();
3) papildomas STRING tipo stulpelis "2012-10", paieška su "=";
4) du papildomi INT tipo stulpeliai, paiešką su "=";

Re: Užklausa iš trijų lentelių

minde> tai as daviau tik nuoroda uzvedimui ant kelio. Kai paimsi menesius, tai analogiskai paimsi ir metus su atitinkamomis funkcijomis is duoto linko. Sitas variantas butu tuo atveju jeigu 'nesigauna' kurti nauju stulpeliu, ir daryti nauju irasu kur metai ir menuo atskirai (kas butu greiciausiai geriausia)