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).