Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Programovacie jazyky, rady, poradňa...
alvar
Amateur
Amateur
Príspevky: 34
Registrovaný: 25 sep 2014, 20:02

Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Príspevok od používateľa alvar »

Zdravím, chcem zobraziť posledných 10 pohybov na účte (z tabuliek príjmov a výdajov). Ako to urobiť tak, aby sa zobrazili od tých najnovších po najstaršie, resp. ako napísať nižšiu podmienku funkčne? Tu je kus kódu, no tá podmienka nefunguje správne.. Dokázali by ste mi ju upraviť? Vďaka!

Kód: Vybrať všetko

 $objekt_vysledkov = mysqli_query($db_spojenie, "SELECT * FROM prijmy WHERE id_uzivatela_prijmy = '$id' ORDER BY datum_prijmu DESC LIMIT 10");  
		if (!$objekt_vysledkov) die ('Chyba v príkaze SQL: ' . mysqli_error($db_spojenie));   
    
    $objekt_vysledkov2 = mysqli_query($db_spojenie, "SELECT * FROM vydaje WHERE id_uzivatela_vydaje = '$id' ORDER BY datum_vydaja DESC LIMIT 10");  
		if (!$objekt_vysledkov2) die ('Chyba v príkaze SQL: ' . mysqli_error($db_spojenie));   
    
     while (($riadok = mysqli_fetch_array($objekt_vysledkov)) && ($riadok2 = mysqli_fetch_array($objekt_vysledkov2))){  
            
       if($riadok['datum_prijmu'] > $riadok2['datum_vydaja']){                  
          echo $riadok['suma_prijmu'] . $riadok['datum_prijmu'] . $riadok['kategoria_prijmu'] . $riadok['popis_prijmu'];  
       }
       
       else {         
          echo $riadok2['suma_vydaja'] . $riadok2['datum_vydaja'] . $riadok2['kategoria_vydaja'] . $riadok2['popis_vydaja'];         
       }
              
     } 
Michaelo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6177
Registrovaný: 16 júl 2008, 20:29
Bydlisko: Pri PC
Kontaktovať používateľa:

Re: Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Príspevok od používateľa Michaelo »

Takto sa while nerobi, ako mozes vediet ze obe SQL vratia rovnaky pocet? Predstav si ze tam mas 10 prijmov, ale jediny vydaj, ten while skonci po prvom zazname...
Oddel si to do dvoch loopov a malo by ti to fungovat.
alvar
Amateur
Amateur
Príspevky: 34
Registrovaný: 25 sep 2014, 20:02

Re: Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Príspevok od používateľa alvar »

Aha, ale ako mám z toho urobiť 2 loopy? Mám ich vsadiť do seba alebo pod seba? Podmienky sú dobré? Skús mi to prosím ťa upraviť, veľmi mi pomôžeš..
eMPiko
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3085
Registrovaný: 11 jan 2007, 16:40

Re: Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Príspevok od používateľa eMPiko »

Najlepsie je uz v SQL prikaze to spojit dokopy. V SQL pozname prikaz UNION, ktory ti spoji dve tabulky za seba. Akoby si ich dal za seba. Musis si ale dat pozor, lebo musis mat v oboch tabulkach rovnaky pocet stlpcov s rovnakym typom, aby si to vedel spojit, napr:

Kód: Vybrať všetko

SELECT suma_vydaja AS suma, kategoria_vydaja AS kategoria, popis_vydaja AS popis, datum_vydaja AS datum, id_pouzivatela_vydaja AS id_pouzivatela FROM vydaje
UNION
SELECT suma_prijmu, kategoria_prijmu, popis_prijmu, datum_prijmu, id_pouzivatela_prijmu FROM prijmy
WHERE id_pouzivatela = 123
ORDER BY datum DESC
LIMIT 10
Tu mas nejaky popis k tomu ako UNION funguje http://www.w3schools.com/sql/sql_union.asp
V tom mojom kode som v prvom selecte pomocou klucoveho slova AS tie stlpce premenoval. Cize vysledna tabulka bude mat stlpce suma, kategoria, popis, datum, id_pouzivatela a bude v nej 10 poslednych zaznamov z tych dvoch tabuliek.

Este mala poznamka, podla mna mas tie stlpce nevhodne pomenovane. Ked mas tabulky vydaje, tak davat to slovicko vydaj do kazdeho stlpca je podla mna zbytocne. Ked mas nejaky stlpec v tabulky vydaje, tak je jasne ze ten stlpec sa tyka tych vydajov. Nemusis to tam uz zasa napisat. Teda napr. namiesto stlpcu suma_vydaju by som pouzil iba stlpec suma a podobne.
alvar
Amateur
Amateur
Príspevky: 34
Registrovaný: 25 sep 2014, 20:02

Re: Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Príspevok od používateľa alvar »

Vďaka! Takže ak by som teraz tieto pomenovania nechal tak, fungovalo by to? Ako teraz tých 10 riadkov vypíšem? Takto nejako?

Kód: Vybrať všetko

while ($riadok = mysqli_fetch_array($objekt_vysledkov)){  
                   
     echo $riadok['suma'] . $riadok['datum'] . $riadok['kategoria'] . $riadok['popis'];  

}
eMPiko
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3085
Registrovaný: 11 jan 2007, 16:40

Re: Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Príspevok od používateľa eMPiko »

Ano, ten kod co som ti poslal by mal fungovat aj s tvojimi terajsimi pomenovaniami, ale este si to skontroluj, ci som spravne napisal nazvy stlpcov a podobne.

A hej, ten vypis je teraz taky jednoduchy, ze vypises vysledky z tabulky
alvar
Amateur
Amateur
Príspevky: 34
Registrovaný: 25 sep 2014, 20:02

Re: Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Príspevok od používateľa alvar »

Nefunguje to :/ Vypisuje mi : Unknown column 'id_uzivatela' in 'where clause'

Tu je upravený kód:

Kód: Vybrať všetko

$objekt_vysledkov = mysqli_query($db_spojenie, "SELECT id_uzivatela_vydaje AS id_uzivatela, suma_vydaja AS suma, kategoria_vydaja AS kategoria, popis_vydaja AS popis, datum_vydaja AS datum FROM vydaje
                                                    UNION
                                                    SELECT id_uzivatela_prijmy, suma_prijmu, kategoria_prijmu, popis_prijmu, datum_prijmu  FROM prijmy
                                                    WHERE id_uzivatela = '$id'
                                                    ORDER BY datum DESC
                                                    LIMIT 10");  
Michaelo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6177
Registrovaný: 16 júl 2008, 20:29
Bydlisko: Pri PC
Kontaktovať používateľa:

Re: Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Príspevok od používateľa Michaelo »

Osobne sa snazim unionom vyhybat, ale v tvojom pripade by mali dobre posluzit aj tie...

Tak trosku pomimo k tym unionom:
Na jednom projekte som musel napisat SQL kde sa z 3ch tabuliek vyberali clanky podla tagov a vypisoval sa z nich zoznam so strankovanim (takze 2x rovnake SQL, raz s datami a limitami, raz count bez limitov)... SQL sice nebolo velmi pomale (stale cez 250ms!), ale PostgreSQL mi vypisovalo ze "cena" toho SQL bola okolo 43.000, co je EXTREMNE vela, kedze tam sa robili 3 uniony s vlastnymi wherami a na tom celom unione este dalsi where a limit...
Nakoniec som to prepisal pred 2 tyzdnami s tym, ze je tam jedna tabulka do ktorej sa leju len podstatne data (co su potrebne pre vypis zoznamu) pomocou triggerov a teraz rovnaky vypis clankov ma "cenu" len cca 7... Nakoniec som to este upravil a hlavnu cast wheru som dal tiez do triggerov, ktore nastavuju jeden stlpec na 0 alebo 1 (podla toho ci vyhovuje podmienka co bola v povodnom WHERE) a zrazu je to SQL o 50% rychlejsie ako bez toho stlpca a nezabije to CPU ked ho spustis par krat po sebe ako to robilo s unionami (nejaky SEO "expert" tam pustal svojho crawlera a spomalil tym komplet cely web, kde nacitavanie jednej stranky trvalo aj 5 sekund, ked sa vypol, zrazu to slo fajn za cca 650ms).

Takze ak mozes, skus sa vyhnut Unionom a skor rozmyslaj ako si spravne navrhnut architekturu.


---

Do toho WHERE musis pouzit nazov povodneho stlpca, nove mena stlpcov co nastavujes cez AS sa do WHERE nedostavaju, neviem ci ma MySQL (uz som ho dlhsie nepouzil, PostgreSQL je lepsi) podmienku HAVING, ale ak ano, mozes pouzit tu s novym menom v AS.

Tuto mas upravene SQL, malo by fungovat a mas tam este policko TYP, ktore mozes kontrolovat ak chces vypisovat prijmy inak ako vydaje (napr ina classa atd.):

Kód: Vybrať všetko

$objekt_vysledkov = mysqli_query($db_spojenie, "(
SELECT 
    id_uzivatela_vydaje AS id_uzivatela, 
    suma_vydaja AS suma, 
    kategoria_vydaja AS kategoria, 
    popis_vydaja AS popis, 
    datum_vydaja AS datum,
    'vydaj' AS typ
FROM 
    vydaje
WHERE
    id_uzivatela_vydaje = '$id'
ORDER BY 
    datum_vydaja DESC
LIMIT 10
)
UNION
(
SELECT 
    id_uzivatela_prijmy AS id_uzivatela,
    suma_prijmu AS suma, 
    kategoria_prijmu AS kategoria, 
    popis_prijmu AS popis, 
    datum_prijmu AS datum,
    'prijem' AS typ
FROM 
    prijmy
WHERE 
    id_uzivatela_prijmy= '$id'
ORDER BY 
    datum_prijmu  DESC
LIMIT 10
)
LIMIT 10");
Asi sa pytas preco tam mas 3x tem limit. Je to kvoli vykonu. Limitnes samotne 2 selecty na 10 riadkov, takto sa ti vrati napr 10 vydajov a 2 prijmy, a potom to cele obmedzis na 10 riadkov celkovo.
Bez tych limitov by ti oba selecty mohli vytiahnut aj 1000 riadkov a nepotrebne by sa zmazali az po unione, co je zbytocne velka zataz na server, ked ich chces len 10 celkovo (takto sa ti vzdy vrati maximalne 20 riadkov).
alvar
Amateur
Amateur
Príspevky: 34
Registrovaný: 25 sep 2014, 20:02

Re: Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Príspevok od používateľa alvar »

už to fičíííííííííííí :) díky moc! (y)
Michaelo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6177
Registrovaný: 16 júl 2008, 20:29
Bydlisko: Pri PC
Kontaktovať používateľa:

Re: Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Príspevok od používateľa Michaelo »

Nezabutni pouzit upravenu verziu nahore (trosku som to editoval, asi tak 6x :D ). Hlavne s tymi limitami, nech ta to nekusne do zadku niekedy neskor.
eMPiko
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3085
Registrovaný: 11 jan 2007, 16:40

Re: Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Príspevok od používateľa eMPiko »

Super oprava, pri UNIONe sa ako nazvy stlpcov beru nazvy z prvej tabulky tak som si myslel ze to pomocou AS zbehne. Este mi napadlo, ked tu Michaelo spominal tu architekturu. Je nejaky dovod, preco vydavky a prijmy nemas v jednej tabulke? Tipujem ze vacsinu tych stlpcov tie tabulky zdielaju, tak to rovno mozes spojit do jednej s tym, ze v nejakom jednom stlpci si budes znacit, ci dany riadok je vydavok alebo prijem.
Michaelo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6177
Registrovaný: 16 júl 2008, 20:29
Bydlisko: Pri PC
Kontaktovať používateľa:

Re: Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Príspevok od používateľa Michaelo »

Ono mat to rozdelene ma svoje vyhody, hlavne ked chces vypisovat len vsetky vydavky, alebo len prijmy a robit na tom divne (rozumej "sialene a vykonovo narocne") where. Takto mas menej riadkov ktore musi DB kontrolovat.
Problem samozrejme potom nastava ked chces vypisovat oba... Osobne by som to tiez skor dal do jednej tabulky a dal by som tam smallint stlpec s nazvom `type_id` ktory by bol 0 pre vydaj a 1 pre prijem a kedykolvek by si pridal dalsi typ, len mu das id 2, alebo 3 atd.
alvar
Amateur
Amateur
Príspevky: 34
Registrovaný: 25 sep 2014, 20:02

Re: Ako z 2 tabuliek vybrať podľa dátumu tie najnovšie dáta

Príspevok od používateľa alvar »

Oddelene som ich dal hlavne kvôli prehľadnosti a pre jednoduchšiu prácu s nimi. Vďaka za pomoc! :)
Napísať odpoveď