|
[ protech_v2 @ 31.07.2005. 17:01 ] @
| Imam ovakav upit:
Code: SELECT 1 as TABLE, coll1, coll2 FROM table1
UNION ALL SELECT 2 as TABLE, coll1, coll2 FROM table2
Ja bih hteo da podatke iz ResultSet-a pokazujem naizmenicno, znaci prvo iz prve tabele jedan, pa sledeci iz druge tabele itd - ovako:
1 coll1 coll2
2 coll1 coll2
1 coll1 coll2
2 coll1 coll2
Znam da to moze nekako sa ORDER BY, ali ne znam tacno kako - pomoc? |
[ _owl_ @ 31.07.2005. 23:39 ] @
Tesko da ces moci to da uradis direktno preko SQL-a. Zar nije jednostavnije da uradis dve SELECT naredbe i da neizmenicno prikazujes podatke iz dva ResultSet-a.
[ goranvuc @ 01.08.2005. 06:00 ] @
Code:
SELECT * FROM
(SELECT 1 as Tabela, coll1, coll2 FROM table1
UNION ALL SELECT 2 as Tabela, coll1, coll2 FROM table2) AS Upit
ORDER BY coll1
[ negyxo @ 01.08.2005. 08:36 ] @
Ovaj upit iznad ne znam koliko ce pomoci. Problem je u tome sto ce se redovi naizmenicno smenjivati samo ako coll1 iz prvog i drugog upita ima iste vrednosti.
Code:
Primer
Tabela 1
----------------------
Tabela, coll1
1, Auto,
1, Bojler,
1, Cisterna,
1, Knjiga,
1, Vrata
Tabela 1
----------------------
Tabela, coll1
2, Auto,
2, Bojler,
2, Voce,
2, Knjiga,
2, Vrata
ce dati rezultat
1, Auto
2, Auto
1, Bojler
2, Bojler
1, Cisterna
1, Knjiga
2, Knjiga
2, Voce
1, Vrata
2, Vrata
Onda drugi problem, nevezano samo za ovaj upit, je i ako broj slogova nije isti u jednom upitu i drugom.
protech_v2 budi malo detaljniji. Po cemu hoces da se naizmenicno menjaju redovi. Ovako mozemo samo da nagadjamo.
[ Riste Pejov @ 15.08.2005. 12:23 ] @
Nisi uopste rekao o kome se RDBMS-u radi, ali recimo da isti taj podrzava stored procs, onda se to najelegantnije resava sa stored procom.
[ protech_v2 @ 15.08.2005. 19:01 ] @
Hvala na trudu zasad, problem je ipak slozeniji nego sto sam uopste mislio, pa je zato i ovo podataka sto sam dao nedovoljno.
Imam MySQL bazu nekretnina u dve tabele - jedna je baza agencije, a druga je baza oglasa koji su uneseni na sajtu. Imam i stranu koja bi trebalo da mi kao rezultate pretrage po razlicitim parametrima vrati zajedno unose iz obe tabele.
E sad, da unosi iz oglasa ne bi bili skroz na dnu, ili samo oglasi na vrhu pa posle tek agencijski unosi, najbolje bi bilo da ide recimo jedan rezultat iz oglasa, pa jedan iz agencijske baze i tako naizmenicno.
Ocigledno, broj recorda u jednoj i drugoj tabeli je razlicit, i nije pravilo da vrednosti u nekoj koloni iz jedne i druge tabele budu iste.
Ovo se naravno moze uz malo vise truda resiti i u kodu (php, u ovom slucaju), ali mi je delovalo kao da mora da postoji nacin da se to elegantnije resi u samom upitu, pa rekoh da probam tako i naucim ponesto usput.
Sad isprobavam neke varijante sa aritmetickim zavrzlamama u upitu  , pa ako uspem nesto javljam
[ _owl_ @ 16.08.2005. 02:26 ] @
Izgleda da neki ljudi obozavaju da prave sto komplikovanije stvari samo da bi neki deo poslovne logike smestili u sloj za koji oni misle da mu ta logika pripada (iako je mozda za implementaciju lakse i bolje da se ta logika nalazi u nekom drugom sloju).
Sledi prevod za one koje mrzi da prethodni pasus citaju sa razumevanjem.
Sinko resi problem kao sto sam ti rekao u mom prvom postu dobices znatno jednostavniji i brzi kod.
[Ovu poruku je menjao _owl_ dana 16.08.2005. u 15:23 GMT+1]
[ Riste Pejov @ 16.08.2005. 08:57 ] @
Kada je MySQL u pitanju, owl ti je dao najbolje a mozda i jedino resenje
[ jablan @ 16.08.2005. 09:57 ] @
Meni je čudnije što ne postoji ni jedan parametar po kome možeš nekretnine da sortiraš (datum postavljanja oglasa, kraj grada, kvadratura, broj soba, cena itd)... Logično je (sa strane korisnika bar) da oglasi budu u nekom redosledu. Korisnika savršeno ne zanima iz koliko se tabela oni vuku.
[Ovu poruku je menjao jablan dana 16.08.2005. u 10:58 GMT+1]
[ obucina @ 16.08.2005. 13:36 ] @
Ili što reče neko na PHP forumu "order by rand()", pa šta ti ispadne...
[ protech_v2 @ 16.08.2005. 23:43 ] @
_OwL_: a za sta onda sluze recimo stored procedures? Pa bolje je da SQL server koji vaze za najbrze i najoptimizovanije aplikacije da radi sve sto moze da odradi umesto PHP-a u ovom slucaju. Mozda si u pravu ako kazes da sam mogao mnogo manje vremena i truda potrositi na taj nacin, ali sam i rekao da namerno radim tako jer znam da moze, a bila mi je zelja da naucim nesto novo usput.
Tako sam i dosao do potencijalnog resenja koje se krije u upotrebi promenjivih u samom upitu za koje nisam ni znao da postoje. Eto, to sam recimo novo naucio.
Nisam imao vremena da cackam oko toga poslednja 2 dana, ali uveren sam da se moze resiti relativno lako preko promenjivih u upitu
[ Riste Pejov @ 18.08.2005. 21:13 ] @
Citat: protech_v2:
Nisam imao vremena da cackam oko toga poslednja 2 dana, ali uveren sam da se moze resiti relativno lako preko promenjivih u upitu
Pa da .. moze se resiti ali ako imas neki pravi RDBMS (Ora,DB2,FB,Pg) koji podrzava stored procedure a ne spreadsheet sa odvratnim interface-om (MySQL) 
[ jajo @ 19.08.2005. 00:11 ] @
Ak imas mysql verziju vecu od 4nesto onda mozes raditi "select from select"
i tad si na konju. Uglavnom ideja je da dobijes u obije tablice redni brojac slogova koje selektiras.
u mysql-u to mozesdobiti s varijablom i u selectu je inkrementirati (select @brojac := @brojac + 1) Medutim u svom selectu vec moras imati tablice s tim brojacem. Ak nemozes raditi "select from select", mozda mozes s nekim viewom (nezanam mysql, u oraclu je sve to puno jednostavnije).
Uglavnom kad to dobijes rjesenje je jednostavno:
select p.prvi, d.drugi from p left join d on p.rbr = d.rbr.
Ovo konkretno je krivo jer radi samo ako prva tablica ima vise slogova od druge, al si shvatio poantu. (konkretno rjesenje mozes dobiti s npr. jednim punim joinom sa unijom 2 ostatka).
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|